in reply to reference to self function

You've already been tipped about can, but it seems like you missed that it returns a reference, which is exactly what you want to store.
my $m = $self->{method}; $self->{funcs}{$m} = $self->can($m);
Then you use
if (my $code = $self->{funcs}{$self->{method}}) { $self->$code(@params); } else { die "..."; }
Why don't you do this check in the constructur, btw?

Note that this isn't equivalent to   $self->{funcs}{$m} = sub { $self->$m(@_) }; You'd get in trouble with the closure solution if you ever decide to clone your object. Then you'd still be using your old object.

Hope this helps,
ihb