package Module1; sub main { my $obj = shift; my $class = { name => __PACKAGE__, }; return bless $class, $obj; } package Module2; sub main { my $obj = shift; my $class = { name => __PACKAGE__, }; return bless $class, $obj; } package main; my $an1 = Module1->main(); print $an1->{name}, $/; my $an2 = Module2->main(); print $an2->{name}, $/; ## And if you must use your dispatch table ## you can do my %dispatch = ( main => Module1->main(), another_page => Module2->main(), ); print "Am in ", $dispatch{main}{name}, $/; print "Am in ", $dispatch{another_page}{name};