package Foo::Parse; #... sub parse { my $self = shift; if (my $func = $self->can('action')) { $self->$func(@_); } } #... package Foo::Parse::Splitter use base 'Foo::Parse'; sub action { my $self = shift; # ... } package main; my $fp = Foo::Parse::Splitter->new('FooParser'); $fp->parse($_) while <>;