X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMoo.pm;h=2c02cf26e66c768b968070208b9a6e9d1f96a45c;hb=c45702917a553f4c038f0fc77869380b57da4742;hp=ae3277eda18dad78d238badf03fc8f1cadcc2d89;hpb=5d5bb71d96bad0fb8d1d7542d94fa89122a46f12;p=gitmo%2FRole-Tiny.git diff --git a/lib/Moo.pm b/lib/Moo.pm index ae3277e..2c02cf2 100644 --- a/lib/Moo.pm +++ b/lib/Moo.pm @@ -3,7 +3,7 @@ package Moo; use strictures 1; use Moo::_Utils; -our $VERSION = '0.009001'; # 0.9.1 +our $VERSION = '0.009004'; # 0.9.4 $VERSION = eval $VERSION; our %MAKERS; @@ -48,31 +48,45 @@ 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 + } + }; + require Moo::_mro unless $moo_constructor; Method::Generate::Constructor ->new( package => $target, accessor_generator => do { require Method::Generate::Accessor; Method::Generate::Accessor->new; - } + }, + ($moo_constructor ? () + : (construction_string => '$class->next::method(@_)')) ) ->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:{}}) } } @@ -230,7 +244,7 @@ The options for C are as follows: =item * is B, must be C or C. Unsurprisingly, C generates an -accessor that will not respond to arguments; to be clear: a setter only. C +accessor that will not respond to arguments; to be clear: a getter only. C will create a perlish getter/setter. =item * isa