my %helper_args = ( Task1 => [ qw(ARG1 ARG2 ARG3) ], Task2 => [ qw(ARG6 ARG2 ARG1 ARG5) ], ## ... ); for my $task ( keys %helper_args ) { *{"Do$task"} = sub { $_[0]->_common_runner( $task, @_[1..$#_] ) }; } sub _common_runner { my $self = shift; my $task = shift; ## "Task1", "Task2", ... my @rest = @_; if( !$self->TaskIsDone() and (my( $setup ) = $self->can( "Setup$task" )) ) { $self->$setup(); } my @args = @{ $helper_args{ $task } || [] }; $self->CommonTask( @args, @rest ); }