Я использую Moose, и мне нужно обернуть вызовы методов в моем проекте. Важно, чтобы мой код-оболочка был самым внешним модификатором. Что я сделал до сих пор, так это поместил модификаторы моего метода в роль Moose, а затем применил эту роль в конце моего класса следующим образом:
use Moose::Util;
Moose::Util::apply_all_roles(__PACKAGE__->meta, ('App:Roles::CustomRole'));
__PACKAGE__->meta->make_immutable;
Это позволяет мне быть достаточно уверенным, что мои модификаторы моей роли определены последними, что дает мне правильное поведение для «до» и «после». («До» и «после» в роли называются самые первые и самые последние.)
Первоначально я думал, что этого будет достаточно, но теперь мне действительно нужно обернуть методы аналогичным образом с «вокруг». Класс::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), но я бы не хотел этого делать.