Почему обработчики атрибутов Perl не вызываются из других пакетов? - PullRequest
5 голосов
/ 22 июня 2011

У меня странная проблема с Атрибутом :: Обработчики, которая выглядит как какая-то ошибка:

package MyPackage;

use Attribute::Handlers;

sub UNIVERSAL::foo :ATTR(CODE) {
  ...
}

При использовании в MyPackage или из основного пакета скрипта, использующего MyPackage, обработчик foo вызывается всякий раз, когда компилятор сталкивается с функцией вида

sub bar:foo {
 ...
}

Однако у меня есть другой пакет в отдельном файле .pm, который использует MyPackage. Компилятор принимает атрибут ": foo", но вызывается обработчик , а не .

Я попытался написать функцию импорта в MyPackage, которая экспортирует обработчик foo в пространство имен вызывающего, но это, похоже, не помогает.

Кто-нибудь может понять это? Последние несколько дней я ломал голову над тем, как это исправить.

Ответы [ 2 ]

3 голосов
/ 22 мая 2012

По умолчанию обработчики атрибутов вызываются в блоке CHECK после фазы компиляции.

Если пакет «using» использует eval "use packagename";, будут выполняться только блоки BEGIN. Блоки CHECK не будут выполнены, и обработчики атрибутов не будут вызваны.

Попробуйте использовать ATTR(CODE,BEGIN) для выполнения обработчика в блоке BEGIN.

0 голосов
/ 22 июня 2011

Вчера я почему-то полностью пропустил Attribute :: Handlers в вашем посте - как уже упоминалось в моем комментарии к более старой версии этого ответа, возможно, завершение use MyPackage в блок BEGIN приведет к правильному разрешению проблем.

Я не уверен, почему вы решили поместить обработчик атрибута foo() в UNIVERSAL - это был шаг к тому, чтобы заставить его работать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...