X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMoose.pm;h=b7043971d8699ef1a3a64805ea154177323c25d0;hb=baf46b9edc7dc3665c7eaf9d1684b157efb09e1a;hp=62f2067246c7d072cf00e9b035ee4b1c04b64911;hpb=1b46b845aec04ca7372393f90641a5e861b60f25;p=gitmo%2FMoose.git diff --git a/lib/Moose.pm b/lib/Moose.pm index 62f2067..b704397 100644 --- a/lib/Moose.pm +++ b/lib/Moose.pm @@ -6,16 +6,16 @@ use warnings; use 5.008; -our $VERSION = '0.58'; +our $VERSION = '0.72_01'; $VERSION = eval $VERSION; our $AUTHORITY = 'cpan:STEVAN'; use Scalar::Util 'blessed'; -use Carp 'confess', 'croak', 'cluck'; +use Carp 'confess'; use Moose::Exporter; -use Class::MOP 0.65; +use Class::MOP 0.78_02; use Moose::Meta::Class; use Moose::Meta::TypeConstraint; @@ -36,6 +36,13 @@ use Moose::Meta::Role::Application::ToInstance; use Moose::Util::TypeConstraints; use Moose::Util (); +sub _caller_info { + my $level = @_ ? ($_[0] + 1) : 2; + my %info; + @info{qw(package file line)} = caller($level); + return \%info; +} + sub throw_error { # FIXME This shift; @@ -45,12 +52,12 @@ sub throw_error { sub extends { my $class = shift; - croak "Must derive at least one class" unless @_; + Moose->throw_error("Must derive at least one class") unless @_; my @supers = @_; foreach my $super (@supers) { Class::MOP::load_class($super); - croak "You cannot inherit from a Moose Role ($super)" + Moose->throw_error("You cannot inherit from a Moose Role ($super)") if $super->can('meta') && blessed $super->meta && $super->meta->isa('Moose::Meta::Role') @@ -73,8 +80,11 @@ sub with { sub has { my $class = shift; my $name = shift; - croak 'Usage: has \'name\' => ( key => value, ... )' if @_ == 1; - my %options = @_; + + Moose->throw_error('Usage: has \'name\' => ( key => value, ... )') + if @_ == 1; + + my %options = ( definition_context => _caller_info(), @_ ); my $attrs = ( ref($name) eq 'ARRAY' ) ? $name : [ ($name) ]; Class::MOP::Class->initialize($class)->add_attribute( $_, %options ) for @$attrs; } @@ -94,8 +104,15 @@ sub around { Moose::Util::add_method_modifier($class, 'around', \@_); } +our $SUPER_PACKAGE; +our $SUPER_BODY; +our @SUPER_ARGS; + sub super { - return unless our $SUPER_BODY; $SUPER_BODY->(our @SUPER_ARGS); + # This check avoids a recursion loop - see + # t/100_bugs/020_super_recursion.t + return if defined $SUPER_PACKAGE && $SUPER_PACKAGE ne caller(); + return unless $SUPER_BODY; $SUPER_BODY->(@SUPER_ARGS); } sub override { @@ -124,16 +141,9 @@ sub augment { Class::MOP::Class->initialize($class)->add_augment_method_modifier( $name => $method ); } -sub make_immutable { - my $class = shift; - cluck "The make_immutable keyword has been deprecated, " . - "please go back to __PACKAGE__->meta->make_immutable\n"; - Class::MOP::Class->initialize($class)->make_immutable(@_); -} - Moose::Exporter->setup_import_methods( with_caller => [ - qw( extends with has before after around override augment make_immutable ) + qw( extends with has before after around override augment) ], as_is => [ qw( super inner ), @@ -244,24 +254,18 @@ sub _get_caller { ## make 'em all immutable -$_->meta->make_immutable( +$_->make_immutable( inline_constructor => 1, constructor_name => "_new", - inline_accessors => 1, # these are Class::MOP accessors, so they need inlining - ) - for (qw( + # these are Class::MOP accessors, so they need inlining + inline_accessors => 1 + ) for grep { $_->is_mutable } + map { $_->meta } + qw( Moose::Meta::Attribute Moose::Meta::Class Moose::Meta::Instance - Moose::Meta::TypeConstraint - Moose::Meta::TypeConstraint::Union - Moose::Meta::TypeConstraint::Parameterized - Moose::Meta::TypeConstraint::Parameterizable - Moose::Meta::TypeConstraint::Enum - Moose::Meta::TypeConstraint::Class - Moose::Meta::TypeConstraint::Role - Moose::Meta::TypeConstraint::Registry Moose::Meta::TypeCoercion Moose::Meta::TypeCoercion::Union @@ -269,7 +273,7 @@ $_->meta->make_immutable( Moose::Meta::Method::Accessor Moose::Meta::Method::Constructor Moose::Meta::Method::Destructor - Moose::Meta::Method::Overriden + Moose::Meta::Method::Overridden Moose::Meta::Method::Augmented Moose::Meta::Role @@ -283,7 +287,7 @@ $_->meta->make_immutable( Moose::Meta::Role::Application::ToClass Moose::Meta::Role::Application::ToRole Moose::Meta::Role::Application::ToInstance -)); +); 1; @@ -336,9 +340,9 @@ metaclass programming as well. =head2 New to Moose? -If you're new to Moose, the best place to start is the L -docs, followed by the L. The intro will show you what -Moose is, and how it makes Perl 5 OO better. +If you're new to Moose, the best place to start is the +L docs, followed by the L. The intro +will show you what Moose is, and how it makes Perl 5 OO better. The cookbook recipes on Moose basics will get you up to speed with many of Moose's features quickly. Once you have an idea of what Moose @@ -402,12 +406,13 @@ superclasses still properly inherit from L. This will apply a given set of C<@roles> to the local class. -=item B %options> +=item B %options> -This will install an attribute of a given C<$name> into the current class. -The C<%options> are the same as those provided by -L, in addition to the list below which are provided -by Moose (L to be more specific): +This will install an attribute of a given C<$name> into the current class. If +the first parameter is an array reference, it will create an attribute for +every C<$name> in the list. The C<%options> are the same as those provided by +L, in addition to the list below which are provided by +Moose (L to be more specific): =over 4 @@ -469,11 +474,10 @@ This is only legal if your C 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, the -updated value and the attribute meta-object (this is for more advanced fiddling -and can typically be ignored). You B have a trigger on a read-only -attribute. +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. B Triggers will only fire when you B to the attribute, either in the constructor, or using the writer. Default and built values will @@ -612,14 +616,14 @@ resolved to a class name. Also see L for a metaclass trait example. -=item I +=item I => Str 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 -for more information. + and/or L for more information. -=item I +=item I => SCALAR | CODE The value of this key is the default value which will initialize the attribute. @@ -630,7 +634,24 @@ See the L for more information. -=item I +=item I => Str + +Creates a method allowing you to clear the value, see the L for more +information. + +=item I => Str + +Creates a method to perform a basic test to see if a value has been set in the +attribute, see the L for more information. + +=item I => (0|1) + +Automatically define lazy => 1 as well as builder => "_build_$attr", clearer => +"clear_$attr', predicate => 'has_$attr' unless they are already defined. + +=item I => Str This may be a method name (referring to a method on the class with this attribute) or a CODE ref. The initializer is used to set the @@ -640,24 +661,11 @@ to). See the L for more information. -=item I - -Allows you to clear the value, see the L for more -information. - -=item I - -Basic test to see if a value has been set in the attribute, see the -L for more -information. - =back =item B %options> -This is variation on the normal attibute creator C which allows you to +This is variation on the normal attribute creator C which allows you to clone and extend an attribute from a superclass or from a role. Here is an example of the superclass usage: @@ -736,7 +744,7 @@ You I allowed to change the type without restriction. It is recommended that you use this freedom with caution. We used to only allow for extension only if the type was a subtype of the parent's type, but we felt that was too restrictive and is better left as a -policy descision. +policy decision. =item I @@ -756,7 +764,7 @@ B allowed to I one. =item I You are allowed to B additional traits to the C definition. -These traits will be composed into the attribute, but pre-existing traits +These traits will be composed into the attribute, but preexisting traits B overridden, or removed. =back @@ -822,7 +830,7 @@ 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. -=head1 TRAIT NAME RESOLUTION +=head2 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 @@ -876,7 +884,7 @@ specified by C. This method injects a a C accessor into the class so you can get at this object. It also sets the class's superclass to C, with L as the default. -You can specify an alternate metaclass with the C parameter. +You can specify an alternate metaclass with the C option. For more detail on this topic, see L. @@ -938,6 +946,16 @@ parent's and child's original metaclasses. Ultimately, this is all transparent to you except in the case of an unresolvable conflict. +=head2 The MooseX:: namespace + +Generally if you're writing an extension I Moose itself you'll want +to put your extension in the C namespace. This namespace is +specifically for extensions that make Moose better or different in some +fundamental way. It is traditionally B for a package that just happens +to use Moose. This namespace follows from the examples of the C +and C namespaces that perform the same function for C and C +respectively. + =head1 CAVEATS =over 4 @@ -960,6 +978,18 @@ not (UPDATE: so far so good). =back +=head1 GETTING HELP + +We offer both a mailing list and a very active IRC channel. + +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. + =head1 ACKNOWLEDGEMENTS =over 4 @@ -987,30 +1017,22 @@ early ideas/feature-requests/encouragement/bug-finding. =item L -This is the official web home of Moose, it contains links to our public SVN repo +This is the official web home of Moose, it contains links to our public SVN repository as well as links to a number of talks and articles on Moose and Moose related technologies. -=item L - How to cook a Moose - =item The Moose is flying, a tutorial by Randal Schwartz Part 1 - L Part 2 - L -=item L documentation - -=item The #moose channel on irc.perl.org - -=item The Moose mailing list - moose@perl.org - -=item Moose stats on ohloh.net - L - =item Several Moose extension modules in the C namespace. See L for extensions. +=item Moose stats on ohloh.net - L + =back =head2 Books @@ -1049,13 +1071,32 @@ the user-visible features. Instead we have made sure that the underlying meta-system of Moose is as extensible as possible so that you can add your own features easily. That said, occasionally there is a feature needed in the meta-system to support your planned extension, in which case you should -either email the mailing list or join us on irc at #moose to discuss. +either email the mailing list or join us on irc at #moose to discuss. The +L has more detail about how and when you can +contribute. =head1 AUTHOR -Stevan Little Estevan@iinteractive.comE +Moose is an open project, there are at this point dozens of people who have +contributed, and can contribute. If you have added anything to the Moose +project you have a commit bit on this file and can add your name to the list. -B +=head2 CABAL + +However there are only a few people with the rights to release a new version +of Moose. The Moose Cabal are the people to go to with questions regarding +the wider purview of Moose, and help out maintaining not just the code +but the community as well. + +Stevan (stevan) Little Estevan@iinteractive.comE + +Yuval (nothingmuch) Kogman + +Shawn (sartak) Moore + +Dave (autarch) Rolsky Eautarch@urth.orgE + +=head2 OTHER CONTRIBUTORS Aankhen @@ -1063,7 +1104,7 @@ Adam (Alias) Kennedy Anders (Debolaz) Nor Berle -Nathan (kolibre) Gray +Nathan (kolibrie) Gray Christian (chansen) Hansen @@ -1085,27 +1126,23 @@ Scott (konobi) McWhirter Shlomi (rindolf) Fish -Yuval (nothingmuch) Kogman - Chris (perigrin) Prather Wallace (wreis) Reis Jonathan (jrockway) Rockway -Dave (autarch) Rolsky - Piotr (dexter) Roszatycki Sam (mugwump) Vilain -Shawn (sartak) Moore +Cory (gphat) Watson ... and many other #moose folks =head1 COPYRIGHT AND LICENSE -Copyright 2006-2008 by Infinity Interactive, Inc. +Copyright 2006-2009 by Infinity Interactive, Inc. L