X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMoo.pm;h=8b1859f8b43bdc8c02968324a59db44220603898;hb=2a79705da24eff6d54bd679e7938223872ecf8ac;hp=545e80a3ead06dcce5437361a6794515a91bf5f7;hpb=f9755246a7eec67300ed639a439be560a12551db;p=gitmo%2FMoo.git diff --git a/lib/Moo.pm b/lib/Moo.pm index 545e80a..8b1859f 100644 --- a/lib/Moo.pm +++ b/lib/Moo.pm @@ -5,7 +5,7 @@ use Moo::_Utils; use B 'perlstring'; use Sub::Defer (); -our $VERSION = '0.091002'; # 0.91.2 +our $VERSION = '0.091004'; # 0.91.4 $VERSION = eval $VERSION; require Moo::sification; @@ -26,10 +26,15 @@ sub import { Moo->_constructor_maker_for($target) ->register_attribute_specs(%{$old->all_attribute_specs}); } + $Moo::HandleMoose::MOUSE{$target} = [ + grep defined, map Mouse::Util::find_meta($_), @_ + ] if $INC{"Mouse.pm"}; + $class->_maybe_reset_handlemoose($target); }; _install_coderef "${target}::with" => "Moo::with" => sub { require Moo::Role; Moo::Role->apply_roles_to_package($target, $_[0]); + $class->_maybe_reset_handlemoose($target); }; $MAKERS{$target} = {}; _install_coderef "${target}::has" => "Moo::has" => sub { @@ -38,6 +43,7 @@ sub import { ->register_attribute_specs($name, \%spec); $class->_accessor_maker_for($target) ->generate_method($target, $name, \%spec); + $class->_maybe_reset_handlemoose($target); }; foreach my $type (qw(before after around)) { _install_coderef "${target}::${type}" => "Moo::${type}" => sub { @@ -56,6 +62,13 @@ sub import { } } +sub _maybe_reset_handlemoose { + my ($class, $target) = @_; + if ($INC{"Moo/HandleMoose.pm"}) { + Moo::HandleMoose::maybe_reinject_fake_metaclass_for($target); + } +} + sub _accessor_maker_for { my ($class, $target) = @_; return unless $MAKERS{$target}; @@ -221,8 +234,13 @@ L everywhere. Extending a L class or consuming a L should also work. +So should extending a L class or consuming a L. + This means that there is no need for anything like L for Moo -code - Moo and Moose code should simply interoperate without problem. +code - Moo and Moose code should simply interoperate without problem. To +handle L code, you'll likely need an empty Moo role or class consuming +or extending the L stuff since it doesn't register true L +metaclasses like we do. However, these features are new as of 0.91.0 (0.091000) so while serviceable, they are absolutely certain to not be 100% yet; please do report bugs. @@ -330,9 +348,24 @@ The options for C are as follows: =item * is -B, must be C or C. Unsurprisingly, C generates an -accessor that will not respond to arguments; to be clear: a getter only. C -will create a perlish getter/setter. +B, may be C, C, C or C. + +C generates an accessor that dies if you attempt to write to it - i.e. +a getter only - by defaulting C to the name of the attribute. + +C generates a normal getter/setter by defauting C to the +name of the attribute. + +C generates a reader like C, but also sets C to 1 and +C to C<_build_${attribute_name}> to allow on-demand generated +attributes. This feature was my attempt to fix my incompetence when +originally designing C, and is also implemented by +L. + +C generates a reader like C, but also sets C to +C<_set_${attribute_name}> for attributes that are designed to be written +from inside of the class, but read-only from outside. +This feature comes from L. =item * isa @@ -346,6 +379,28 @@ one should do L +Since L does B run the C check before C if a coercion +subroutine has been supplied, C checks are not structural to your code +and can, if desired, be omitted on non-debug builds (although if this results +in an uncaught bug causing your program to break, the L authors guarantee +nothing except that you get to keep both halves). + +If you want L style named types, look at +L. + +To cause your C entries to be automatically mapped to named +L objects (rather than the default behaviour +of creating an anonymous type), set: + + $Moo::HandleMoose::TYPE_MAP{$isa_coderef} = sub { + require MooseX::Types::Something; + return MooseX::Types::Something::TypeName(); + }; + +Note that this example is purely illustrative; anything that returns a +L object or something similar enough to it to +make L happy is fine. + =item * coerce Takes a coderef which is meant to coerce the attribute. The basic idea is to @@ -355,7 +410,10 @@ do something like the following: $_[0] + 1 unless $_[0] % 2 }, -Coerce does not require C to be defined. +Note that L will always fire your coercion - this is to permit +isa entries to be used purely for bug trapping, whereas coercions are +always structural to your code. We do, however, apply any supplied C +check after the coercion has run to ensure that it returned a valid value. L @@ -384,6 +442,10 @@ Takes a coderef which will get called any time the attribute is set. This includes the constructor. Coderef will be invoked against the object with the new value as an argument. +If you set this to just C<1>, it generates a trigger which calls the +C<_trigger_${attr_name}> method on C<$self>. This feature comes from +L. + Note that Moose also passes the old value, if any; this feature is not yet supported. @@ -406,8 +468,10 @@ L Takes a method name which will return true if an attribute has a value. -A common example of this would be to call it C, implying that the -object has a C<$foo> set. +If you set this to just C<1>, the predicate is automatically named +C if your attribute's name does not start with an +underscore, or <_has_${attr_name_without_the_underscore}> if it does. +This feature comes from L. =item * builder @@ -420,10 +484,18 @@ Moo will call $self->$builder; +If you set this to just C<1>, the predicate is automatically named +C<_build_${attr_name}>. This feature comes from L. + =item * clearer Takes a method name which will clear the attribute. +If you set this to just C<1>, the clearer is automatically named +C if your attribute's name does not start with an +underscore, or <_clear_${attr_name_without_the_underscore}> if it does. +This feature comes from L. + =item * lazy B. Set this if you want values for the attribute to be grabbed @@ -457,6 +529,7 @@ leaks. Takes the name of the key to look for at instantiation time of the object. A 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. =back @@ -529,9 +602,13 @@ C 'lazy'> option supported by L and L. C is not supported since the author considers it a bad idea. C will show up in a L metaclass created from your class -but is otherwise ignored. Then again, L ignors it as well, so this +but is otherwise ignored. Then again, L ignores it as well, so this is arguably not an incompatibility. +Since C does not require C to be defined but L does +require it, the metaclass inflation for coerce-alone is a trifle insane +and if you attempt to subtype the result will almost certainly break. + Handling of warnings: when you C we enable FATAL warnings. The nearest similar invocation for L would be: