use strict; use warnings; sub new { my ($class, $act) = @_; my %activities = ( ACT => $act, ACTIVITIES => { 'Sale' => {datefield => "date_sold",}, 'Purchae' => {datefield => "date_bought",}, } ); my $self = bless \%activities, $class; return $self; } sub get_stats { my ($self, $arg) = @_; my $funcName = "_do$self->{ACT}"; my $func = $self->can($funcName); die "Class " . ref($self) . " doesn't know how to '$funcName'\n" if !$func; $self->$func($arg); } sub _doSale { my ($self, $arg) = @_; $self->dosomething($arg); } sub _doPurchae { my ($self, $arg) = @_; ... } sub dosomething { my ($self, $arg) = @_; print "This is test ($arg)...\n"; } my $obj = main->new('Sale'); $obj->get_stats('wibble'); #### This is test (wibble)...