use strictures 1;
use Moo::_Utils;
+use B 'perlstring';
-our $VERSION = '0.009003'; # 0.9.3
+our $VERSION = '0.009008'; # 0.9.8
$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;
- my $con;
+ require Sub::Defer;
+ my ($moo_constructor, $con);
- # 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 via the ->register_attribute_specs call later
-
- if (my $super = do { no strict 'refs'; ${"${target}::ISA"}[-1] }) {
- $con = $MAKERS{$super}{constructor} if $MAKERS{$super};
- }
- my $moo_constructor = !!$con || do {
+ if ($select_super && $MAKERS{$select_super}) {
+ $moo_constructor = 1;
+ $con = $MAKERS{$select_super}{constructor};
+ } else {
my $t_new = $target->can('new');
- $t_new and $t_new == Moo::Object->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,
require Method::Generate::Accessor;
Method::Generate::Accessor->new;
},
- ($moo_constructor ? ()
- : (construction_string => '$class->next::method(@_)'))
+ construction_string => (
+ $moo_constructor
+ ? ($con ? $con->construction_string : undef)
+ : ('$class->'.$target.'::SUPER::new(@_)')
+ ),
+ subconstructor_generator => (
+ $class.'->_constructor_maker_for($class,'.perlstring($target).')'
+ ),
)
->install_delayed
->register_attribute_specs(%{$con?$con->all_attribute_specs:{}})
=item * coerce
-This Moose feature is not yet supported
-
-=begin hide
-
Takes a coderef which is meant to coerce the attribute. The basic idea is to
do something like the following:
$_[0] + 1 unless $_[0] % 2
},
-L<Sub::Quote aware|/SUB QUOTE AWARE>
+Coerce does not require C<isa> to be defined.
-=end hide
+L<Sub::Quote aware|/SUB QUOTE AWARE>
=item * trigger
C<auto_deref> is not supported since the author considers it a bad idea.
C<documentation> is not supported since it's a very poor replacement for POD.
+
+=head1 AUTHOR
+
+mst - Matt S. Trout (cpan:MSTROUT) <mst@shadowcat.co.uk>
+
+=head1 CONTRIBUTORS
+
+dg - David Leadbeater (cpan:DGL) <dgl@dgl.cx>
+
+frew - Arthur Axel "fREW" Schmidt (cpan:FREW) <frioux@gmail.com>
+
+hobbs - Andrew Rodland (cpan:ARODLAND) <arodland@cpan.org>
+
+jnap - John Napiorkowski (cpan:JJNAPIORK) <jjn1056@yahoo.com>
+
+ribasushi - Peter Rabbitson (cpan:RIBASUSHI) <ribasushi@cpan.org>
+
+chip - Chip Salzenberg (cpan:CHIPS) <chip@pobox.com>
+
+=head1 COPYRIGHT
+
+Copyright (c) 2010-2011 the Moo L</AUTHOR> and L</CONTRIBUTORS>
+as listed above.
+
+=head1 LICENSE
+
+This library is free software and may be distributed under the same terms
+as perl itself.
+
+=cut