my %commands = ( name => { args => 2, usage => 'name arg1 arg2', sub => 'sub_1', # might wanna allow for code refs here :) }, ); my @cmd = split /\s+/, $command; if ($commands{$cmd[0]}) { my $sub = $commands{$cmd[0]}{sub}; if ($#cmd == $commands{$cmd[0]}{args}) { $self->$sub(@cmd); } else { print "usage: ..." } } else { print "unknown command $cmd[0]"}