I have a Moose class that is intended to be subclassed, and every subclass has to implement an "execute" method. However, I would like to put apply a method modifier to the execute method in my class, so that it applies to the execute method in all subclasses. But method modifiers are not preserved when a method is overriden. Is there any way to ensure that all subclasses of my class will have my method modifier applied to their execute methods?
Example: In a superclass, I have this:
before execute => sub {
print "Before modifier is executing.\n"
}
Then, in a subclass of that:
sub execute {
print "Execute method is running.\n"
}
When the execute method is called, it doesn't say anything about the "before" modifier.
This is what the augment
method modifier is made for. You can put this in your superclass:
sub execute {
print "This runs before the subclass code";
inner();
print "This runs after the subclass code";
}
And then instead of allowing your subclasses to override execute
directly, you have them augment
it:
augment 'execute' => sub {
print "This is the subclass method";
};
Basically it gives you functionality that's just like the around
modifier, except with the parent/child relationship changed.
来源:https://stackoverflow.com/questions/4965197/in-perl-moose-how-can-i-apply-a-modifier-to-a-method-in-all-subclasses