in reply to Multiple "constructors", possible to call several.

As you say, programming like this probably causes some maintenance problems. Having said that, you should look at UNIVERSAL::isa()

Your test of $invokant also won't work if called by a class inheriting from MyClass:

package MyClass; sub new { print shift; } package MySubClass; @MySubClass::ISA = qw(MyClass); package main my $test = new MySubClass; __DATA__ prints "MySubClass"

So having said that, I probably would write the constructor like this:

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; } }
___ Simon Flack ($code or die)
$,=reverse'"ro_';s,$,\$,;s,$,lc ref sub{},e;$,
=~y'_"' ';eval"die";print $_,lc substr$@,0,3;