X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMoose.pm;h=6abdc945b7d24636fe67fadb9d57eafe4490b0ff;hb=870d0f1a40aafaeab1155cae153ac60c47cd12ec;hp=eceddf7307809a41a39fa0194b2eaa7e372df946;hpb=e9c2746e922547b99f67f231edef6c232f0e3140;p=gitmo%2FMoose.git diff --git a/lib/Moose.pm b/lib/Moose.pm index eceddf7..6abdc94 100644 --- a/lib/Moose.pm +++ b/lib/Moose.pm @@ -4,7 +4,7 @@ use warnings; use 5.008; -our $VERSION = '0.85'; +our $VERSION = '0.94'; $VERSION = eval $VERSION; our $AUTHORITY = 'cpan:STEVAN'; @@ -13,7 +13,7 @@ use Carp 'confess'; use Moose::Exporter; -use Class::MOP 0.88; +use Class::MOP 0.94; use Moose::Meta::Class; use Moose::Meta::TypeConstraint; @@ -34,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; @@ -41,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; @@ -95,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 { @@ -115,14 +113,14 @@ 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 => [ - qw( extends with has before after around override augment) + with_meta => [ + qw( extends with has before after around override augment ) ], as_is => [ qw( super inner ), @@ -161,7 +159,12 @@ sub init_meta { if ( $meta = Class::MOP::get_metaclass_by_name($class) ) { unless ( $meta->isa("Moose::Meta::Class") ) { - Moose->throw_error("$class already has a metaclass, but it does not inherit $metaclass ($meta)"); + my $error_message = "$class already has a metaclass, but it does not inherit $metaclass ($meta)."; + if ( $meta->isa('Moose::Meta::Role') ) { + Moose->throw_error($error_message . ' You cannot make the same thing a role and a class. Remove either Moose or Moose::Role.'); + } else { + Moose->throw_error($error_message); + } } } else { # no metaclass, no 'meta' method @@ -173,7 +176,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 @@ -256,6 +259,7 @@ $_->make_immutable( Moose::Meta::Method::Augmented Moose::Meta::Role + Moose::Meta::Role::Attribute Moose::Meta::Role::Method Moose::Meta::Role::Method::Required Moose::Meta::Role::Method::Conflicting @@ -269,6 +273,11 @@ $_->make_immutable( Moose::Meta::Role::Application::ToInstance ); +Moose::Meta::Mixin::AttributeCore->meta->make_immutable( + inline_constructor => 0, + constructor_name => undef, +); + 1; __END__ @@ -337,6 +346,18 @@ is to search for them (L), or to examine L which aims to keep an up-to-date, easily installable list of Moose extensions. +=head1 TRANSLATIONS + +Much of the Moose documentation has been translated into other languages. + +=over 4 + +=item Japanese + +Japanese docs can be found at L. The source POD files can be found in GitHub: L + +=back + =head1 BUILDING CLASSES WITH MOOSE Moose makes every attempt to provide as much convenience as possible during @@ -450,15 +471,22 @@ If an attribute is marked as lazy it B have a default supplied. =item I (1|0)> -This tells the accessor whether to automatically dereference the value returned. -This is only legal if your C option is either C or C. +This tells the accessor to automatically dereference the value of this +attribute when called in list context. The accessor will still return a +reference when called in scalar context. If this behavior isn't desirable, +L or +L may be a better +choice. The I option is only legal if your I option is +either C or C. =item I $code> 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 @@ -538,6 +566,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 @@ -585,13 +625,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 ]> @@ -599,8 +634,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. @@ -610,7 +645,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 @@ -775,10 +810,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 @@ -831,9 +866,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 @@ -848,6 +884,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. @@ -991,9 +1030,9 @@ The mailing list is L. You must be subscribed to send a message. To subscribe, send an empty message to L -You can also visit us at L<#moose on -irc.perl.org|irc://irc.perl.org/#moose>. This channel is quite active, -and questions at all levels (on Moose-related topics ;) are welcome. +You can also visit us at C<#moose> on L +This channel is quite active, and questions at all levels (on Moose-related +topics ;) are welcome. =head1 ACKNOWLEDGEMENTS @@ -1071,6 +1110,9 @@ exception. Please report any bugs to C, or through the web interface at L. +You can also discuss feature requests or possible bugs on the Moose mailing +list (moose@perl.org) or on IRC at L. + =head1 FEATURE REQUESTS We are very strict about what features we add to the Moose core, especially @@ -1100,9 +1142,17 @@ but the community as well. Stevan (stevan) Little Estevan@iinteractive.comE +Jesse (doy) Luehrs Edoy at tozt dot netE + Yuval (nothingmuch) Kogman -Shawn (sartak) Moore +Shawn (sartak) Moore Esartak@bestpractical.comE + +Hans Dieter (confound) Pearcey Ehdp@pobox.comE + +Chris (perigrin) Prather + +Florian Ragwitz Erafl@debian.orgE Dave (autarch) Rolsky Eautarch@urth.orgE @@ -1118,8 +1168,6 @@ Nathan (kolibrie) Gray Christian (chansen) Hansen -Hans Dieter (confound) Pearcey - Eric (ewilhelm) Wilhelm Guillermo (groditi) Roditi @@ -1136,8 +1184,6 @@ Scott (konobi) McWhirter Shlomi (rindolf) Fish -Chris (perigrin) Prather - Wallace (wreis) Reis Jonathan (jrockway) Rockway @@ -1154,7 +1200,7 @@ Dylan Hardison (doc fixes) =head1 COPYRIGHT AND LICENSE -Copyright 2006-2009 by Infinity Interactive, Inc. +Copyright 2006-2010 by Infinity Interactive, Inc. L