package My::Factory; 1; sub new { my $factory = shift; my $name = shift; my $classfile = package_name(); $classfile =~ s/Factory.pm$/$name.pm/; if ( -e $classfile ) { require $classfile; my $classname = "My::$name"; return $classname->new(@_); } else { die "class not found: $classfile"; } } sub package_name { my (@called) = caller(0); return $called[1]; }