sub parse { my $self=shift; my $meth = $self->{_action} || die "Missing action"; $self->$meth(@_); } # it might be better to do this once in the new # and then call it the way you have it # I normally check every time as the penalty is low # and I then know for sure I still have an action.