X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMoose.pm;h=f9e156dc7e48f2dc614ab5ec46c38943d6752981;hb=b86a4688111e7f7c0ddbc2195a9ce3c1ec877563;hp=45cac8892c2652f313a96c9bba9c4c389af35f78;hpb=9e4ed568f2e5c1041e6fea8d0cbde420562ab5df;p=gitmo%2FMoose.git diff --git a/lib/Moose.pm b/lib/Moose.pm index 45cac88..f9e156d 100644 --- a/lib/Moose.pm +++ b/lib/Moose.pm @@ -1,8 +1,10 @@ package Moose; +use strict; +use warnings; use 5.008; -our $VERSION = '0.84'; +our $VERSION = '0.89_02'; $VERSION = eval $VERSION; our $AUTHORITY = 'cpan:STEVAN'; @@ -11,7 +13,7 @@ use Carp 'confess'; use Moose::Exporter; -use Class::MOP 0.88; +use Class::MOP 0.92_01; use Moose::Meta::Class; use Moose::Meta::TypeConstraint; @@ -32,6 +34,8 @@ use Moose::Meta::Role::Application::ToInstance; use Moose::Util::TypeConstraints; use Moose::Util (); +use Moose::Meta::Attribute::Native; + sub throw_error { # FIXME This shift; @@ -39,46 +43,42 @@ sub throw_error { } sub extends { - my $class = shift; + my $meta = shift; Moose->throw_error("Must derive at least one class") unless @_; # this checks the metaclass to make sure # it is correct, sometimes it can get out # of sync when the classes are being built - Moose::Meta::Class->initialize($class)->superclasses(@_); + $meta->superclasses(@_); } sub with { - my $class = shift; - Moose::Util::apply_all_roles(Class::MOP::Class->initialize($class), @_); + Moose::Util::apply_all_roles(shift, @_); } sub has { - my $class = shift; - my $name = shift; + my $meta = shift; + my $name = shift; Moose->throw_error('Usage: has \'name\' => ( key => value, ... )') if @_ % 2 == 1; my %options = ( definition_context => Moose::Util::_caller_info(), @_ ); my $attrs = ( ref($name) eq 'ARRAY' ) ? $name : [ ($name) ]; - Class::MOP::Class->initialize($class)->add_attribute( $_, %options ) for @$attrs; + $meta->add_attribute( $_, %options ) for @$attrs; } sub before { - my $class = shift; - Moose::Util::add_method_modifier($class, 'before', \@_); + Moose::Util::add_method_modifier(shift, 'before', \@_); } sub after { - my $class = shift; - Moose::Util::add_method_modifier($class, 'after', \@_); + Moose::Util::add_method_modifier(shift, 'after', \@_); } sub around { - my $class = shift; - Moose::Util::add_method_modifier($class, 'around', \@_); + Moose::Util::add_method_modifier(shift, 'around', \@_); } our $SUPER_PACKAGE; @@ -93,9 +93,9 @@ sub super { } sub override { - my $class = shift; + my $meta = shift; my ( $name, $method ) = @_; - Class::MOP::Class->initialize($class)->add_override_method_modifier( $name => $method ); + $meta->add_override_method_modifier( $name => $method ); } sub inner { @@ -113,13 +113,13 @@ sub inner { } sub augment { - my $class = shift; + my $meta = shift; my ( $name, $method ) = @_; - Class::MOP::Class->initialize($class)->add_augment_method_modifier( $name => $method ); + $meta->add_augment_method_modifier( $name => $method ); } Moose::Exporter->setup_import_methods( - with_caller => [ + with_meta => [ qw( extends with has before after around override augment) ], as_is => [ @@ -171,7 +171,7 @@ sub init_meta { my $ancestor_meta = Class::MOP::get_metaclass_by_name($ancestor) || next; my $ancestor_meta_class = ($ancestor_meta->is_immutable - ? $ancestor_meta->get_mutable_metaclass_name + ? $ancestor_meta->_get_mutable_metaclass_name : ref($ancestor_meta)); # if we have an ancestor metaclass that inherits $metaclass, we use @@ -455,8 +455,10 @@ This is only legal if your C option is either C or C. The I option is a CODE reference which will be called after the value of the attribute is set. The CODE ref will be passed the -instance itself and the updated value. You B have a trigger on -a read-only attribute. +instance itself and the updated value. If the attribute already had a +value, this will be passed as the third value to the trigger. + +You B have a trigger on a read-only attribute. B Triggers will only fire when you B to the attribute, either in the constructor, or using the writer. Default and built values will @@ -536,6 +538,18 @@ In this example, the Tree package gets C and C methods, which delegate to the C and C methods (respectively) of the Tree instance stored in the C slot. +You may also use an array reference to curry arguments to the original method. + + has 'thing' => ( + ... + handles => { set_foo => [ set => 'foo' ] }, + ); + + # $self->set_foo(...) calls $self->thing->set('foo', ...) + +The first element of the array reference is the original method name, and the +rest is a list of curried arguments. + =item C The regexp option works very similar to the ARRAY option, except that it builds @@ -560,7 +574,7 @@ With the duck type option, you pass a duck type object whose "interface" then becomes the list of methods to handle. The "interface" can be defined as; the list of methods passed to C to create a duck type object. For more information on C please check -L. +L. =item C @@ -583,13 +597,8 @@ capabilities of the I keyword: they are the simplest way to extend the MOP, but they are still a fairly advanced topic and too much to cover here, see L for more information. -The default behavior here is to just load C<$metaclass_name>; however, we also -have a way to alias to a shorter name. This will first look to see if -B exists. If it does, Moose -will then check to see if that has the method C, which -should return the actual name of the custom attribute metaclass. If there is no -C method, it will fall back to using -B as the metaclass name. +See L for details on how a metaclass name +is resolved to a class name. =item I [ @role_names ]> @@ -597,8 +606,8 @@ This tells Moose to take the list of C<@role_names> and apply them to the attribute meta-object. This is very similar to the I option, but allows you to use more than one extension at a time. -See L for details on how a trait name is -resolved to a class name. +See L for details on how a trait name is +resolved to a role name. Also see L for a metaclass trait example. @@ -608,7 +617,7 @@ example. The value of this key is the name of the method that will be called to obtain the value used to initialize the attribute. See the L - and/or L for more information. + and/or L for more information. =item I => SCALAR | CODE @@ -773,10 +782,10 @@ B overridden, or removed. =item B sub { ... }> -This three items are syntactic sugar for the before, after, and around method +These three items are syntactic sugar for the before, after, and around method modifier features that L provides. More information on these may be -found in the L for now. +found in L and the +L. =item B @@ -829,9 +838,10 @@ You can also specify traits which will be applied to your metaclass: This is very similar to the attribute traits feature. When you do this, your class's C object will have the specified traits -applied to it. See L for more details. +applied to it. See L for more +details. -=head2 Trait Name Resolution +=head2 Metaclass and Trait Name Resolution By default, when given a trait name, Moose simply tries to load a class of the same name. If such a class does not exist, it then looks @@ -846,6 +856,9 @@ return the I class name of the trait. If there is no C method, it will fall back to using B as the trait name. +The lookup method for metaclasses is the same, except that it looks +for a class matching B. + If all this is confusing, take a look at L, which demonstrates how to create an attribute trait. @@ -1100,10 +1113,14 @@ Stevan (stevan) Little Estevan@iinteractive.comE Yuval (nothingmuch) Kogman -Shawn (sartak) Moore +Shawn (sartak) Moore Esartak@bestpractical.comE Dave (autarch) Rolsky Eautarch@urth.orgE +Jesse (doy) Luehrs Edoy at tozt dot netE + +Hans Dieter (confound) Pearcey Ehdp@pobox.comE + =head2 OTHER CONTRIBUTORS Aankhen @@ -1116,8 +1133,6 @@ Nathan (kolibrie) Gray Christian (chansen) Hansen -Hans Dieter (confound) Pearcey - Eric (ewilhelm) Wilhelm Guillermo (groditi) Roditi