package Plugin;
...
sub process {
my $self = shift;
my $foo = shift;
$foo->FooMethod();
...
}
sub processes {
return qw/Foo/; # this module's process method likes objects which isa Foo.
}
####
sub process {
my $self = shift;
my $obj = shift;
my @args = @_;
DISPATCH: foreach my $plugin ($self->host->stack("process") { # the stack of plugins that ->process
foreach my $class ($plugin->processes){
next unless $obj->isa($class);
return $self->host->specific($plugin)->process($obj, $args);
}
}
}
####
package Plugin;
sub process : expects(FooClass) {
my $self = shift;
my $foo = shift;
}