X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMoo.pm;h=0dfaf8d1040b3ee00166ce6f9c2ec898bdf849c9;hb=c600e70640098ae6ad958dc7a07187464abd37d3;hp=ad2960660ca66d291a2a1ff8db1d9f0acb06f5d9;hpb=6d98aee264126a01271d0af878b1a0b48c5ae4a1;p=gitmo%2FMoo.git diff --git a/lib/Moo.pm b/lib/Moo.pm index ad29606..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.002000'; # 1.2.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,6 +191,8 @@ sub _constructor_maker_for { } 1; +__END__ + =pod =encoding utf-8 @@ -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 @@ -366,7 +386,7 @@ This method should always return a hash reference of named options. 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 recieve the same arguments as C, and should return a list +It will receive the same arguments as C, and should return a list of arguments to pass to the parent class constructor. =head2 BUILD @@ -511,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