【发布时间】:2010-12-14 17:22:21
【问题描述】:
我正在使用 Moose,我需要在我的项目中包装方法调用。重要的是我的包装代码是最外层的修饰符。到目前为止,我所做的是将我的方法修饰符放在 Moose 角色中,然后在我的课程结束时应用该角色,如下所示:
use Moose::Util;
Moose::Util::apply_all_roles(__PACKAGE__->meta, ('App:Roles::CustomRole'));
__PACKAGE__->meta->make_immutable;
这使我能够合理地确定我的角色的修饰符是最后定义的,因此为我提供了“之前”和“之后”的正确行为。 (角色中的“之前”和“之后”被称为最前和最末。)
我原本以为这样就足够了,但现在我真的需要用“around”以类似的方式包装方法。 Moose 所基于的 Class::MOP 最先应用“around”修饰符,因此它们在“before”之后和“after”之前被调用。
更多细节,这里是我的修饰符的当前调用顺序:
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
关于如何在我想要的地方应用/调用我的“around”修饰符有什么想法吗?我知道我可以做一些符号表黑客(比如 Class::MOP 已经在做),但我真的不想这样做。
【问题讨论】:
-
我同意下面 Ether 的问题,你为什么使用
Moose::Util::apply_all_roles而不是with? -
与类中可能已经存在的其他修饰符相比,我希望我的角色中的“之前”和“之后”修饰符首先或最后运行。稍后手动应用角色定义修饰符,然后修饰符首先运行(对于之前)和最后(对于之后)。
-
@perigrin 我终于明白了你和以太的问题。我不需要像我想的那样用 apply_all_roles 应用角色。我对 Moose 还很陌生,并且对需要“手动”应用该角色的想法感到困惑。我真正需要做的就是在文件末尾(在其他修饰符之后)使用“with”而不是开头。