require the dev version of CMOP, 0.77_01
[gitmo/Moose.git] / lib / Moose.pm
index ed2ff23..f9be77e 100644 (file)
@@ -6,16 +6,16 @@ use warnings;
 
 use 5.008;
 
-our $VERSION   = '0.58';
+our $VERSION   = '0.71_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.67;
+use Class::MOP 0.77_01;
 
 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;
 
@@ -470,11 +474,10 @@ This is only legal if your C<isa> option is either C<ArrayRef> or C<HashRef>.
 
 =item I<trigger =E<gt> $code>
 
-The I<trigger> 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<cannot> have a trigger on a read-only
-attribute. 
+The I<trigger> 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<cannot> have a trigger on
+a read-only attribute.
 
 B<NOTE:> Triggers will only fire when you B<assign> to the attribute,
 either in the constructor, or using the writer. Default and built values will
@@ -613,14 +616,14 @@ resolved to a class name.
 Also see L<Moose::Cookbook::Meta::Recipe3> for a metaclass trait
 example.
 
-=item I<builder>
+=item I<builder> => 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<builder
 option docs in Class::MOP::Attribute|Class::MOP::Attribute/builder>
 for more information.
 
-=item I<default>
+=item I<default> => SCALAR | CODE
 
 The value of this key is the default value which will initialize the attribute.
 
@@ -631,7 +634,24 @@ See the L<default option docs in
 Class::MOP::Attribute|Class::MOP::Attribute/default> for more
 information.
 
-=item I<initializer>
+=item I<clearer> => Str
+
+Creates a method allowing you to clear the value, see the L<clearer option
+docs in Class::MOP::Attribute|Class::MOP::Attribute/clearer> for more
+information.
+
+=item I<predicate> => Str
+
+Creates a method to perform a basic test to see if a value has been set in the
+attribute, see the L<predicate option docs in
+Class::MOP::Attribute|Class::MOP::Attribute/predicate> for more information.
+
+=item I<lazy_build> => (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<initializer> => 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
@@ -641,24 +661,11 @@ to). See the L<initializer option docs in
 Class::MOP::Attribute|Class::MOP::Attribute/initializer> for more
 information.
 
-=item I<clearer>
-
-Allows you to clear the value, see the L<clearer option docs in
-Class::MOP::Attribute|Class::MOP::Attribute/clearer> for more
-information.
-
-=item I<predicate>
-
-Basic test to see if a value has been set in the attribute, see the
-L<predicate option docs in
-Class::MOP::Attribute|Class::MOP::Attribute/predicate> for more
-information.
-
 =back
 
 =item B<has +$name =E<gt> %options>
 
-This is variation on the normal attibute creator C<has> which allows you to
+This is variation on the normal attribute creator C<has> which allows you to
 clone and extend an attribute from a superclass or from a role. Here is an 
 example of the superclass usage:
 
@@ -737,7 +744,7 @@ You I<are> 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<handles>
 
@@ -757,7 +764,7 @@ B<not> allowed to I<change> one.
 =item I<traits>
 
 You are allowed to B<add> additional traits to the C<traits> 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<are not> overridden, or removed.
 
 =back
@@ -877,7 +884,7 @@ specified by C<for_class>. This method injects a a C<meta> accessor
 into the class so you can get at this object. It also sets the class's
 superclass to C<base_class>, with L<Moose::Object> as the default.
 
-You can specify an alternate metaclass with the C<metaclass> parameter.
+You can specify an alternate metaclass with the C<metaclass> option.
 
 For more detail on this topic, see L<Moose::Cookbook::Extending::Recipe2>.
 
@@ -971,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<moose@perl.org>. You must be subscribed to send
+a message. To subscribe, send an empty message to
+L<moose-subscribe@perl.org>
+
+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
@@ -998,30 +1017,22 @@ early ideas/feature-requests/encouragement/bug-finding.
 
 =item L<http://www.iinteractive.com/moose>
 
-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<Moose::Cookbook> - How to cook a Moose
-
 =item The Moose is flying, a tutorial by Randal Schwartz
 
 Part 1 - L<http://www.stonehenge.com/merlyn/LinuxMag/col94.html>
 
 Part 2 - L<http://www.stonehenge.com/merlyn/LinuxMag/col95.html>
 
-=item L<Class::MOP> documentation
-
-=item The #moose channel on irc.perl.org
-
-=item The Moose mailing list - moose@perl.org
-
-=item Moose stats on ohloh.net - L<http://www.ohloh.net/projects/moose>
-
 =item Several Moose extension modules in the C<MooseX::> namespace.
 
 See L<http://search.cpan.org/search?query=MooseX::> for extensions.
 
+=item Moose stats on ohloh.net - L<http://www.ohloh.net/projects/moose>
+
 =back
 
 =head2 Books
@@ -1072,17 +1083,17 @@ project you have a commit bit on this file and can add your name to the list.
 
 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 pervue of Moose, and help out maintaining not just the code
-but the commnity as well.
+the wider purview of Moose, and help out maintaining not just the code
+but the community as well.
 
 Stevan (stevan) Little E<lt>stevan@iinteractive.comE<gt>
 
-Dave (autarch) Rolsky 
-
 Yuval (nothingmuch) Kogman
 
 Shawn (sartak) Moore
 
+Dave (autarch) Rolsky E<lt>autarch@urth.orgE<gt>
+
 =head2 OTHER CONTRIBUTORS
 
 Aankhen
@@ -1091,7 +1102,7 @@ Adam (Alias) Kennedy
 
 Anders (Debolaz) Nor Berle
 
-Nathan (kolibre) Gray
+Nathan (kolibrie) Gray
 
 Christian (chansen) Hansen
 
@@ -1123,11 +1134,13 @@ Piotr (dexter) Roszatycki
 
 Sam (mugwump) Vilain
 
+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<http://www.iinteractive.com>