Есть ли способ связать тайник в Perl?

Подобно тому, как AUTOLOAD может использоваться для определения подпрограмм по запросу, мне интересно, есть ли способ связать тайник пакета, чтобы я мог перехватывать доступ к переменным в этом пакете.

Я пробовал различные варианты следующей идеи, но, похоже, ни одна из них не работает:

{package Tie::Stash;
    use Tie::Hash;
    BEGIN {our @ISA = 'Tie::StdHash'}
    sub FETCH {
        print "calling fetch\n";
    }
}

{package Target}

BEGIN {tie %Target::, 'Tie::Stash'}

say $Target::x;  

Это умирает с неверным символом для скаляра .. . в последней строке, без вывода «вызывающая выборка» . Если строка say $ Target :: x; удаляется, программа запускается и завершается правильно.

Я предполагаю, что сбой связан с тем, что тайники похожи, но не идентичны хешам, поэтому стандартный механизм связывания не работает должным образом (или может быть просто поиск тайника никогда не вызывает магию связывания).

Кто-нибудь знает, возможно ли это? Чистый Perl был бы лучше, но решения XS подойдут.

8
задан SQB 25 June 2015 в 07:48
поделиться