X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMoo.pm;h=16b7db479c2133f8caed3aded65476436bcc43a6;hb=06c4d037a4df6e38e96aa0ff0a3cb50ab6966955;hp=3f1d810365f9e5415e745a2b330f95bc831c06c4;hpb=0654a8fa4c314bd609501283694ef1cd3b2a58be;p=gitmo%2FMoo.git diff --git a/lib/Moo.pm b/lib/Moo.pm index 3f1d810..16b7db4 100644 --- a/lib/Moo.pm +++ b/lib/Moo.pm @@ -2,8 +2,9 @@ package Moo; use strictures 1; use Moo::_Utils; +use B 'perlstring'; -our $VERSION = '0.009002'; +our $VERSION = '0.009010'; # 0.9.10 $VERSION = eval $VERSION; our %MAKERS; @@ -48,50 +49,62 @@ 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(@_)') + ), + subconstructor_generator => ( + $class.'->_constructor_maker_for($class,'.perlstring($target).')' + ), ) ->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:{}}) } } 1; +=pod + +=encoding utf-8 =head1 NAME Moo - Minimalist Object Orientation (with Moose compatiblity) -=head1 WARNING WARNING WARNING - -This is a 0.9 release because we're fairly sure it works. For us. Until it's -tested in the wild, we make no guarantees it also works for you. - -If this module does something unexpected, please submit a failing test. - -But if it eats your cat, sleeps with your boyfriend, or pushes grandma down -the stairs to save her from the terrible secret of space, it's not our fault. - =head1 SYNOPSIS package Cat::Food; @@ -178,7 +191,25 @@ or =head2 BUILDARGS -This feature from Moose is not yet supported. + around BUILDARGS => sub { + my $orig = shift; + my ( $class, @args ) = @_; + + unshift @args, "attr1" if @args % 2 == 1; + + return $class->$orig(@args); + }; + + Foo::Bar->new( 3 ); + +The default implementation of this method accepts a hash or hash reference of +named parameters. If it receives a single argument that isn't a hash reference +it throws an error. + +You can override this method in your class to handle other types of options +passed to the constructor. + +This method should always return a hash reference of named options. =head2 BUILDALL @@ -247,10 +278,6 @@ L =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: @@ -258,9 +285,9 @@ do something like the following: $_[0] + 1 unless $_[0] % 2 }, -L +Coerce does not require C to be defined. -=end hide +L =item * trigger @@ -317,6 +344,18 @@ another attribute to be set. B. Set this if the attribute must be passed on instantiation. +=item * reader + +The value of this attribute will be the name of the method to get the value of +the attribute. If you like Java style methods, you might set this to +C + +=item * writer + +The value of this attribute will be the name of the method to set the value of +the attribute. If you like Java style methods, you might set this to +C + =item * weak_ref B. Set this if you want the reference that the attribute contains to @@ -387,3 +426,35 @@ manually set all the options it implies. C is not supported since the author considers it a bad idea. C is not supported since it's a very poor replacement for POD. + +=head1 AUTHOR + +mst - Matt S. Trout (cpan:MSTROUT) + +=head1 CONTRIBUTORS + +dg - David Leadbeater (cpan:DGL) + +frew - Arthur Axel "fREW" Schmidt (cpan:FREW) + +hobbs - Andrew Rodland (cpan:ARODLAND) + +jnap - John Napiorkowski (cpan:JJNAPIORK) + +ribasushi - Peter Rabbitson (cpan:RIBASUSHI) + +chip - Chip Salzenberg (cpan:CHIPS) + +ajgb - Alex J. G. Burzyński (cpan:AJGB) + +=head1 COPYRIGHT + +Copyright (c) 2010-2011 the Moo L and L +as listed above. + +=head1 LICENSE + +This library is free software and may be distributed under the same terms +as perl itself. + +=cut