Estoy usando Moose y necesito envolver llamadas a métodos en mi proyecto. Es importante que mi código de envoltura sea el modificador más externo. Lo que he hecho hasta ahora es poner mi método modificadores en un papel de alces y luego aplicar ese papel al final de mi clase como esta:Modificadores del método Perl Moose: Llamar 'alrededor' antes de 'antes' y 'después'
use Moose::Util;
Moose::Util::apply_all_roles(__PACKAGE__->meta, ('App:Roles::CustomRole'));
__PACKAGE__->meta->make_immutable;
Esto me permite estar razonablemente seguros de que los modificadores de mi mi papel son Definido por último, por lo tanto, me da el comportamiento correcto para "antes" y "después". (El "antes" y el "después" en el rol se llaman primero y el último.)
Originalmente pensé que esto sería suficiente, pero ahora realmente necesito ajustar los métodos de forma similar con "alrededor". Class :: MOP, en el que se basa Moose, aplica modificadores de "alrededor" primero, por lo tanto se llaman después de "antes" y antes de "después".
Para más detalles, aquí está el orden de llamada actual de mis modificadores:
CUSTOM ROLE before
before 2
before 1
CUSTOM ROLE around
around
method
around
CUSTOM ROLE around
after 1
after 2
CUSTOM ROLE AFTER
que realmente necesitan algo como esto:
CUSTOM ROLE before
CUSTOM ROLE around
before 2
before 1
around
method
around
after 1
after 2
CUSTOM ROLE around
CUSTOM ROLE AFTER
¿Alguna idea sobre cómo conseguir mi modificador "alrededor" para ser aplicado/llamado donde quiero? Sé que podría hacer algo de hacking de tablas de símbolos (como Class :: MOP ya está haciendo) pero preferiría no hacerlo.
Acepto la siguiente pregunta de Ether, ¿por qué estás usando 'Moose :: Util :: apply_all_roles' en lugar de' with'? – perigrin
Quería que los modificadores 'antes' y 'después' de mi función se ejecutaran primero o en el último lugar en comparación con otros modificadores que pudieran existir en la clase. Al aplicar el rol manualmente, se definen los modificadores más adelante y luego los modificadores se ejecutan primero (para antes) y último (para después). –
@perigrin Finalmente entendí tu pregunta y la de Ether. No necesito aplicar el rol con apply_all_roles como pensaba.Todavía soy nuevo para Moose y me obsesioné con la idea de tener que aplicar el rol "manualmente". Todo lo que realmente necesitaba hacer era aplicarlo con "con" al final del archivo (después de los otros modificadores) en lugar de al principio. –