On Sun, Apr 19, 2009 at 07:58:18AM +0800, Fayland Lam wrote: > package Test; > > use Moose; > > sub new { > my $class = shift; > my $params = $class->BUILDARGS(@_); > > my $obj; > if ( $params->{ver} == 1 ) { > require T::V1; > $obj = T::V1->new($params); > } else { > require T::V2; > $obj = T::V2->new($params); > } > > return $class->meta->new_object( > __INSTANCE__ => $obj, > @_, > ); > }
I can't imagine a situation where this is correct. At best, it's just confusing -- you're calling Test->meta->new_object, but returning a T::V1 or a T::V2, and I'm pretty sure it's an undocumented feature that new_object doesn't e.g. rebless into Test there. You're barely using Moose here, and the parts that you are using, you're using in a confusing and nonstandard way. Much simpler would be: package Test; sub new { my $class = shift; my $params = (@_ == 1 and ref $_[0] eq 'HASH') ? $_[0] : {...@_}; my $version = $params->{ver} ||= 2; my $t_class = "T::V$version"; Class::MOP::load_class($t_class); return $t_class->new($params); } This isn't what Moose means by "delegation", btw; see "handles" for that. hdp.