package Command; sub new { return (bless {}, shift); } sub execute { } package Get_normal; @ISA = qw( Command ); sub execute { my ($O, $target, $key) = @_; $target->get_normal ($key); return; } package Data_holder; sub new { {...} my $g = new Get_normal; $O->{'get-funcs'} = { 'key-1' => $g, {...} } {...} } sub get { {...} my $cmd = $O->{'get-funcs'}->{ $k } || $O->{'get-funcs'}->{'get_error'} ; $result->{ $k } = $cmd->execute ( $k ); {...} }