package People; sub new { my ($classname, $type, $data_ref) = @_ ; my $class = $classname . '::' . $type ; use $class; return $class->new( $data_ref ) ; } # new ####################### package People::Employee; sub new{ ... } sub name{...} ... ###################### In a script far, far away: use People; my $employee = People->new( 'Employee', {name => 'Someone',...}); print $employee->name;