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; }