if ($act eq 'open_file'){ #stuff; } elsif ( $act eq 'open_stuff') { # stuff; } elsif ( $act eq 'speak' ) { # stuff; } #### package My::Actions; use Carp; sub factory { my ($class, $action) = @_; my %actions = ( open_file => 'My::Actions::OpenFile', open_stuff => 'My::Actions::OpenStuff', speak => 'My::Actions::Speak' ); croak "Unknown action ($action)" unless exists $actions{$action}; my $class = $actions{$action}; return $class->new; } sub do_stuff { my $class = shift; croak "Class ($class) did not implement do_stuff()"; } #### use My::Actions; my $object = My::Actions->factory($act); $object->do_stuff;