use strictures 1;
use Moo::_Utils;
-our $VERSION = '0.009002';
+our $VERSION = '0.009004'; # 0.9.4
$VERSION = eval $VERSION;
our %MAKERS;
}
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:{}})
}
}
=item * is
B<required>, must be C<ro> or C<rw>. Unsurprisingly, C<ro> generates an
-accessor that will not respond to arguments; to be clear: a setter only. C<rw>
+accessor that will not respond to arguments; to be clear: a getter only. C<rw>
will create a perlish getter/setter.
=item * isa