在Perl / Moose中,我如何将修饰符应用于所有子类中的方法?

12

我有一个Moose类,打算作为子类的父类,并且每个子类都必须实现一个"execute"方法。但是,我想给我的类中的execute方法应用一个方法修饰符,以便它适用于所有子类中的execute方法。但是当方法被覆盖时,方法修饰符不会被保留。有没有办法确保我类的所有子类都将我的方法修饰符应用于他们的execute方法?

例如:在一个超类中,我有这样的代码:

before execute => sub {
    print "Before modifier is executing.\n"
}

接着,在该子类中:

sub execute {
    print "Execute method is running.\n"
}
当调用execute方法时,它并没有提及“before”修饰符。
1个回答

9
这就是 augment 方法修饰符的作用。你可以把它放在你的超类中:
sub execute {
  print "This runs before the subclass code";
  inner();
  print "This runs after the subclass code";
}

然后,不要允许您的子类直接覆盖execute,而是让它们augment

augment 'execute' => sub {
  print "This is the subclass method";
};

基本上,它提供了与around修饰符完全相同的功能,只是父/子关系发生了变化。


2
哦,我忘了提到我的超类实际上继承自另一个非Moose类,该类期望其子类声明一个execute方法,因此augment / inner无法使用。但是我同意这通常是解决方案。至于我的具体问题,我发现我可以简单地将修改器放在调用execute的方法上,因为该方法在子类中从未被重新定义或覆盖。所以我想我会接受这个答案。 - Ryan C. Thompson
@Ryan Thompson,我没有尝试过这个,但我认为你可以在父类和子类之间放置一个几乎为空的Moose类。然后将hobbs的执行方法放入您的Moose适配器类中,继承其他所有内容,就可以了。警告:未经测试、未经尝试、思路不清晰的胡言乱语,请谨慎使用。 - daotoad
1
@Ryan,但是超类确实声明了一个execute方法,并且它是期望其子类声明execute方法的类的子类,因此augment/inner的所有内容都是合法的。方法实际上添加在树的哪个位置应该是无关紧要的。 - hobbs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接