package Node; my %METHODS = ( somemethod => \&Node::somemethod, ); my %NODE; sub new { my $class = shift; my $name = shift; my $self = { NAME => $name }; bless $self, $class; $NODE{ $name } = $self; return $self; } sub dispatch { my $method = shift; my $name = shift; $METHODS{ $method }->( $NODE{ $name }, @_ ); } sub somemethod { my $self = shift; # ... }