package FooParent; use Carp 'croak'; sub new { # Return either a FooSpecial1 or FooSpecial2 my( $class, %options )= @_; if( $options{ special } == 1 ) { return FooSpecial1->new( %options, special1_param => 'something' ); } elsif( $options{ special } == 2 ) { return FooSpecial2->new( %options, other_special_param => 'something else' ); } else { croak "Unknown special '$options{special}' requested"; }; }; package FooSpecial1; package FooSpecial2; package main; my $frobnitz = FooParent->new();