add alias resolution for "use Moose -metaclass"
Jesse Luehrs [Fri, 31 Jul 2009 03:44:06 +0000 (22:44 -0500)]
Changes
lib/Moose.pm
lib/Moose/Exporter.pm
lib/Moose/Manual/Delta.pod
lib/Moose/Role.pm
lib/Moose/Util.pm
t/050_metaclasses/022_new_metaclass.t

diff --git a/Changes b/Changes
index 07144a9..0d8a3e7 100644 (file)
--- a/Changes
+++ b/Changes
@@ -14,6 +14,10 @@ next version
     * Moose::Meta::TypeConstraint
       - Add assert_valid method to use a TypeConstraint for assertion (rjbs)
 
+    * Moose::Exporter
+      - Make "use Moose -metaclass => 'Foo'" do alias resolution, like -traits
+        does. (doy)
+
 0.88 Fri Jul 24, 2009
     * Moose::Manual::Contributing
       - Re-write the Moose::Manual::Contributing document to reflect
index 1c77f78..44dc9e9 100644 (file)
@@ -585,13 +585,8 @@ capabilities of the I<has> 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<Moose::Cookbook::Meta::Recipe1> 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<Moose::Meta::Attribute::Custom::$metaclass_name> exists. If it does, Moose
-will then check to see if that has the method C<register_implementation>, which
-should return the actual name of the custom attribute metaclass. If there is no
-C<register_implementation> method, it will fall back to using
-B<Moose::Meta::Attribute::Custom::$metaclass_name> as the metaclass name.
+See L<Metaclass and Trait Name Resolution> for details on how a metaclass name
+is resolved to a class name.
 
 =item I<traits =E<gt> [ @role_names ]>
 
@@ -599,8 +594,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<metaclass> option, but
 allows you to use more than one extension at a time.
 
-See L<Trait Name Resolution> for details on how a trait name is
-resolved to a class name.
+See L<Metaclass and Trait Name Resolution> for details on how a trait name is
+resolved to a role name.
 
 Also see L<Moose::Cookbook::Meta::Recipe3> for a metaclass trait
 example.
@@ -831,9 +826,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<meta> object will have the specified traits
-applied to it. See L<Trait Name Resolution> for more details.
+applied to it. See L<Metaclass and Trait Name Resolution> 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 +844,9 @@ return the I<real> class name of the trait. If there is no
 C<register_implementation> method, it will fall back to using
 B<Moose::Meta::$type::Custom::Trait::$trait> as the trait name.
 
+The lookup method for metaclasses is the same, except that it looks
+for a class matching B<Moose::Meta::$type::Custom::$metaclass_name>.
+
 If all this is confusing, take a look at
 L<Moose::Cookbook::Meta::Recipe3>, which demonstrates how to create an
 attribute trait.
index cb46603..6ca7ca6 100644 (file)
@@ -369,6 +369,9 @@ sub _make_import_sub {
 
         my $metaclass;
         ( $metaclass, @_ ) = _strip_metaclass(@_);
+        $metaclass = Moose::Util::resolve_metaclass_alias(
+            'Class' => $metaclass
+        ) if defined $metaclass && length $metaclass;
 
         # Normally we could look at $_[0], but in some weird cases
         # (involving goto &Moose::import), $_[0] ends as something
index a548c0a..cf98390 100644 (file)
@@ -16,6 +16,11 @@ feature.  If you encounter a problem and have a solution but don't see
 it documented here, or think we missed an important feature, please
 send us a patch.
 
+=head1 Version 0.89
+
+C<< use Moose -metaclass => 'Foo' >> now does alias resolution, just like
+C<-traits> (and the C<metaclass> and C<traits> options to C<has>).
+
 =head1 Version 0.84
 
 When an attribute generates I<no> accessors, we now warn. This is to help
index 01837ce..ed4c136 100644 (file)
@@ -228,7 +228,8 @@ You can also specify traits which will be applied to your role metaclass:
 
 This is very similar to the attribute traits feature. When you do
 this, your class's C<meta> object will have the specified traits
-applied to it. See L<Moose/Trait Name Resolution> for more details.
+applied to it. See L<Moose/Metaclass and Trait Name Resolution> for more
+details.
 
 =head1 CAVEATS
 
index 079ad56..33b22b8 100644 (file)
@@ -309,8 +309,8 @@ when specifying the C<metaclass> or C<traits> option for an attribute:
         metaclass => "Bar",
     );
 
-The name resolution mechanism is covered in L<Moose/Trait Name
-Resolution>.
+The name resolution mechanism is covered in
+L<Moose/Metaclass and Trait Name Resolution>.
 
 =item B<english_list(@items)>
 
index 1eca249..5d98c50 100644 (file)
@@ -1,12 +1,15 @@
 #!/usr/bin/env perl
 use strict;
 use warnings;
-use Test::More tests => 1;
+use Test::More tests => 2;
 
 do {
     package My::Meta::Class;
     use Moose;
     BEGIN { extends 'Moose::Meta::Class' };
+
+    package Moose::Meta::Class::Custom::MyMetaClass;
+    sub register_implementation { 'My::Meta::Class' }
 };
 
 do {
@@ -14,5 +17,11 @@ do {
     use Moose -metaclass => 'My::Meta::Class';
 };
 
+do {
+    package My::Class::Aliased;
+    use Moose -metaclass => 'MyMetaClass';
+};
+
 is(My::Class->meta->meta->name, 'My::Meta::Class');
+is(My::Class::Aliased->meta->meta->name, 'My::Meta::Class');