in reply to Re: class inheritance and new(constructor)
in thread class inheritance and new(constructor)

I like to use a simplified version of this (excellent) concept. I try to have only one simpele new method in the base class (and my apps try to have only one base class a la Objective-C/Java etc.) which calls an _init method for the initialisation tasks. It seems to work fairly well for me. Eg:

package MyApp::BaseClass; sub new { my $class = shift; my $init_args = shift; # a real example would have warnings etc. here. ref $init_args eq 'HASH' || $init_args = {}; my $self = { _init => $init_args }; bless $self, $type; # self is re-assigned to allow the _init to replace itself $self = $self->_init() || UsefullErrorObject->new({ class => $class, args => $i +nit_args }); return $self; } sub _init { my $self = shift; # subclass this # first hashref argument to new() is in $self->{_init} return $self; }
A real benefit of this setup is that since you never sublass new() you can always guarantee that new() will return an object (possibly an error object) which removes the need to test every object creation with an if defined type test.

Season to suit.