X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMoo.pm;h=0dfaf8d1040b3ee00166ce6f9c2ec898bdf849c9;hb=c600e70640098ae6ad958dc7a07187464abd37d3;hp=2904243afde53d0451b195275c8e4add3505c795;hpb=9a3fc505bf4bf30c884fccc5fdac9d85508d28fd;p=gitmo%2FMoo.git diff --git a/lib/Moo.pm b/lib/Moo.pm index 2904243..0dfaf8d 100644 --- a/lib/Moo.pm +++ b/lib/Moo.pm @@ -5,7 +5,7 @@ use Moo::_Utils; use B 'perlstring'; use Sub::Defer (); -our $VERSION = '1.001000'; # 1.1.0 +our $VERSION = '1.003001'; $VERSION = eval $VERSION; require Moo::sification; @@ -22,7 +22,7 @@ sub import { my $target = caller; my $class = shift; strictures->import; - if ($Moo::Role::INFO{$target} and $Moo::Role::INFO{$target}{is_role}) { + if ($Role::Tiny::INFO{$target} and $Role::Tiny::INFO{$target}{is_role}) { die "Cannot import Moo into a role"; } $MAKERS{$target} ||= {}; @@ -37,12 +37,18 @@ sub import { $class->_maybe_reset_handlemoose($target); }; _install_tracked $target => has => sub { - my ($name_proto, %spec) = @_; - my $name_isref = ref $name_proto eq 'ARRAY'; - foreach my $name ($name_isref ? @$name_proto : $name_proto) { - # Note that when $name_proto is an arrayref, each attribute + my $name_proto = shift; + my @name_proto = ref $name_proto eq 'ARRAY' ? @$name_proto : $name_proto; + if (@_ % 2 != 0) { + require Carp; + Carp::croak("Invalid options for " . join(', ', map "'$_'", @name_proto) + . " attribute(s): even number of arguments expected, got " . scalar @_) + } + my %spec = @_; + foreach my $name (@name_proto) { + # Note that when multiple attributes specified, each attribute # needs a separate \%specs hashref - my $spec_ref = $name_isref ? +{%spec} : \%spec; + my $spec_ref = @name_proto > 1 ? +{%spec} : \%spec; $class->_constructor_maker_for($target) ->register_attribute_specs($name, $spec_ref); $class->_accessor_maker_for($target) @@ -93,6 +99,9 @@ sub _set_superclasses { Moo->_constructor_maker_for($target) ->register_attribute_specs(%{$old->all_attribute_specs}); } + elsif (!$target->isa('Moo::Object')) { + Moo->_constructor_maker_for($target); + } no warnings 'once'; # piss off. -- mst $Moo::HandleMoose::MOUSE{$target} = [ grep defined, map Mouse::Util::find_meta($_), @_ @@ -112,7 +121,7 @@ sub _accessor_maker_for { $MAKERS{$target}{accessor} ||= do { my $maker_class = do { if (my $m = do { - if (my $defer_target = + if (my $defer_target = (Sub::Defer::defer_info($target->can('new'))||[])->[0] ) { my ($pkg) = ($defer_target =~ /^(.*)::[^:]+$/); @@ -157,7 +166,7 @@ sub _constructor_maker_for { } else { $moo_constructor = 1; # no other constructor, make a Moo one } - }; + } ($con ? ref($con) : 'Method::Generate::Constructor') ->new( package => $target, @@ -182,13 +191,15 @@ sub _constructor_maker_for { } 1; +__END__ + =pod =encoding utf-8 =head1 NAME -Moo - Minimalist Object Orientation (with Moose compatiblity) +Moo - Minimalist Object Orientation (with Moose compatibility) =head1 SYNOPSIS @@ -312,6 +323,15 @@ to your code before Moose is loaded, but bear in mind that this switch is currently global and turns the mechanism off entirely so don't put this in library code. +=head1 MOO AND CLASS::XSACCESSOR + +If a new enough version of L is available, it +will be used to generate simple accessors, readers, and writers for +a speed boost. Simple accessors are those without lazy defaults, +type checks/coercions, or triggers. Readers and writers generated +by L will behave slightly differently: they will +reject attempts to call them with the incorrect number of parameters. + =head1 MOO VERSUS ANY::MOOSE L will load L normally, and L in a program using @@ -362,6 +382,13 @@ passed to the constructor. This method should always return a hash reference of named options. +=head2 FOREIGNBUILDARGS + +If you are inheriting from a non-Moo class, the arguments passed to the parent +class constructor can be manipulated by defining a C method. +It will receive the same arguments as C, and should return a list +of arguments to pass to the parent class constructor. + =head2 BUILD Define a C method on your class and the constructor will automatically @@ -504,7 +531,7 @@ Takes a coderef which is meant to coerce the attribute. The basic idea is to do something like the following: coerce => sub { - $_[0] + 1 unless $_[0] % 2 + $_[0] % 2 ? $_[0] : $_[0] + 1 }, Note that L will always fire your coercion: this is to permit @@ -638,6 +665,13 @@ common use of this is to make an underscored attribute have a non-underscored initialization name. C means that passing the value in on instantiation is ignored. +=item * C + +Takes either a coderef or array of coderefs which is meant to transform the +given attributes specifications if necessary when upgrading to a Moose role or +class. You shouldn't need this by default, but is provided as a means of +possible extensibility. + =back =head2 before