Я использую Moose, и мне нужно обернуть вызовы методов в моем проекте. Важно, чтобы мой код переноса был самым внешним модификатором. До сих пор я помещал мои модификаторы методов в роль лося, а затем применял эту роль в конце моего класса следующим образом:
use Moose::Util;
Moose::Util::apply_all_roles(__PACKAGE__->meta, ('App:Roles::CustomRole'));
__PACKAGE__->meta->make_immutable;
Это позволяет мне быть достаточно уверенным, что модификаторы моей роли определены в последнюю очередь, что дает мне правильное поведение для «до» и «после». («До» и «после» в роли называются самыми первыми и самыми последними.)
Изначально я думал, что этого будет достаточно, но теперь мне действительно нужно обернуть методы таким же образом, как "вокруг". Class :: MOP, на котором построен Moose, применяет модификаторы «вокруг» в первую очередь, поэтому они вызываются после «до» и до «после».
Для более подробной информации, вот текущий порядок вызовов моих модификаторов:
CUSTOM ROLE before
before 2
before 1
CUSTOM ROLE around
around
method
around
CUSTOM ROLE around
after 1
after 2
CUSTOM ROLE AFTER
Мне действительно нужно что-то вроде этого:
CUSTOM ROLE before
CUSTOM ROLE around
before 2
before 1
around
method
around
after 1
after 2
CUSTOM ROLE around
CUSTOM ROLE AFTER
Есть какие-нибудь идеи о том, как получить / вызвать мой модификатор "вокруг", куда я хочу? Я знаю, что мог бы сделать некоторый взлом таблицы символов (как Class :: MOP уже делает), но я бы действительно не хотел.