Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

In Perl/Moose, how can I apply a modifier to a method in all subclasses?

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.

like image 378
Ryan C. Thompson Avatar asked Feb 11 '11 02:02

Ryan C. Thompson


1 Answers

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.

like image 140
hobbs Avatar answered Oct 19 '22 01:10

hobbs