【发布时间】:2013-10-22 23:15:36
【问题描述】:
我有一个提供方法修饰符的角色,如下所示:
package MyApp::Role::MenuExtensionRed;
use Moose::Role;
requires 'BuildMenu';
after 'BuildMenu' => sub {...};
由于其他地方的要求,我需要在运行时应用多个角色,如下所示:
package MyApp::MainMenu
before 'BuildMenu' => sub {
my ( $self, $args ) = @_;
my $roles = $args->{menu_extensions};
apply_all_roles($self,@$roles);
};
sub BuildMenu {...}
然而,'after' 方法修饰符永远不会被调用。显然我违反了一些规则,但我真的很想了解为什么这不起作用!
如果不是在“BuildMenu”之前应用角色,而是在 BUILD 方法中应用它们,它就可以工作。但不幸的是,当时我的 menu_extension 角色列表不可用,所以我必须等待。
任何替代解决方案将不胜感激!
EDIT 有趣的是,after 'BuildMenu' 被调用,但仅在随后调用 BuildMenu 时调用。所以一个方法的修饰符不能从它自己的另一个修饰符中改变。这是预期的行为吗?有没有办法在运行时添加到修饰符的“列表”中?
【问题讨论】:
-
只是一个猜测,但它可能会在进入 sub 时检查之前/之后的包装器。