package Foo; use namespace::autoclean; use Moose; has dispatcher => ( is => 'ro', lazy => 1, builder => '_build_dispatcher' ); # bare bones dispatcher sub _build_dispatcher { my $self = shift; return sub { my ( $action, @args ) = @_; die "I can't do that, Dave" unless $self->can( $action ); $self->$action( @args ); } } # ...Elsewhere, in a class that inherits from Foo: $self->dispatcher->( $action => @params );