我有一个提供方法修饰符的角色,如下所示:
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 角色列表不可用,所以我必须等待。
任何替代解决方案将不胜感激!
编辑有趣的是,after 'BuildMenu'
被调用,但仅在随后调用 BuildMenu 时调用。所以一个方法的修饰符不能从它自己的另一个修饰符中改变。这是预期的行为吗?有没有办法在运行时添加到修饰符的“列表”?