X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMoo.pm;h=a06eae10317110da409d0fae9778108df1886dbc;hb=86fd58e79443f7642bb7d7dc2d9c20b64f6070f0;hp=571415e9e3924c3a613e23b4935c815f224a9707;hpb=38cd3669126e955a79e70555e825f05e3d00de67;p=gitmo%2FRole-Tiny.git diff --git a/lib/Moo.pm b/lib/Moo.pm index 571415e..a06eae1 100644 --- a/lib/Moo.pm +++ b/lib/Moo.pm @@ -3,7 +3,7 @@ package Moo; use strictures 1; use Moo::_Utils; -our $VERSION = '0.009003'; # 0.9.3 +our $VERSION = '0.009005'; # 0.9.5 $VERSION = eval $VERSION; our %MAKERS; @@ -48,31 +48,47 @@ sub import { } sub _constructor_maker_for { - my ($class, $target) = @_; + my ($class, $target, $select_super) = @_; return unless $MAKERS{$target}; $MAKERS{$target}{constructor} ||= do { require Method::Generate::Constructor; + require Sub::Defer; + my ($moo_constructor, $con); + + if ($select_super && $MAKERS{$select_super}) { + $moo_constructor = 1; + $con = $MAKERS{$select_super}{constructor}; + } else { + my $t_new = $target->can('new'); + if ($t_new) { + if ($t_new == Moo::Object->can('new')) { + $moo_constructor = 1; + } elsif (my $defer_target = (Sub::Defer::defer_info($t_new)||[])->[0]) { + my ($pkg) = ($defer_target =~ /^(.*)::[^:]+$/); + if ($MAKERS{$pkg}) { + $moo_constructor = 1; + $con = $MAKERS{$pkg}{constructor}; + } + } + } else { + $moo_constructor = 1; # no other constructor, make a Moo one + } + }; Method::Generate::Constructor ->new( package => $target, accessor_generator => do { require Method::Generate::Accessor; Method::Generate::Accessor->new; - } + }, + construction_string => ( + $moo_constructor + ? ($con ? $con->construction_string : undef) + : ('$class->'.$target.'::SUPER::new(@_)') + ) ) ->install_delayed - ->register_attribute_specs(do { - my @spec; - # using the -last- entry in @ISA means that classes created by - # Role::Tiny as N roles + superclass will still get the attributes - # from the superclass - if (my $super = do { no strict 'refs'; ${"${target}::ISA"}[-1] }) { - if (my $con = $MAKERS{$super}{constructor}) { - @spec = %{$con->all_attribute_specs}; - } - } - @spec; - }); + ->register_attribute_specs(%{$con?$con->all_attribute_specs:{}}) } }