package MyClass; sub new { print shift; } package MySubClass; @MySubClass::ISA = qw(MyClass); package main my $test = new MySubClass; __DATA__ prints "MySubClass" #### sub _new_or_old { my $invokant = shift; defined( $invokant ) or return undef; if( UNIVERSAL::isa($invokant, 'MyClass' ) { return $invokant; } else { my $self = {}; bless( $self, $invokant ); return $self; } }