Version 1.04
[gitmo/Moose.git] / lib / Moose / Meta / Role / Application / ToRole.pm
index 3908179..1507f54 100644 (file)
@@ -6,7 +6,7 @@ use metaclass;
 
 use Scalar::Util    'blessed';
 
-our $VERSION   = '0.85';
+our $VERSION   = '1.04';
 $VERSION = eval $VERSION;
 our $AUTHORITY = 'cpan:STEVAN';
 
@@ -63,8 +63,7 @@ sub apply_attributes {
         }
         else {
             $role2->add_attribute(
-                $attribute_name,
-                $role1->get_attribute($attribute_name)
+                $role1->get_attribute($attribute_name)->clone
             );
         }
     }
@@ -73,12 +72,32 @@ sub apply_attributes {
 sub apply_methods {
     my ($self, $role1, $role2) = @_;
     foreach my $method_name ($role1->get_method_list) {
+        next if $method_name eq 'meta';
+
+        unless ( $self->is_method_excluded($method_name) ) {
+            if (   $role2->has_method($method_name)
+                && $role2->get_method($method_name)->body
+                != $role1->get_method($method_name)->body ) {
+
+                # method conflicts between roles result in the method becoming
+                # a requirement
+                $role2->add_conflicting_method(
+                    name  => $method_name,
+                    roles => [ $role1->name, $role2->name ],
+                );
+            }
+            else {
+                $role2->add_method(
+                    $method_name,
+                    $role1->get_method($method_name)
+                );
+            }
+        }
 
         if ($self->is_method_aliased($method_name)) {
             my $aliased_method_name = $self->get_method_aliases->{$method_name};
-            # it if it has one already
+
             if ($role2->has_method($aliased_method_name) &&
-                # and if they are not the same thing ...
                 $role2->get_method($aliased_method_name)->body != $role1->get_method($method_name)->body) {
 
                 require Moose;
@@ -94,32 +113,7 @@ sub apply_methods {
                 $role2->add_required_methods($method_name)
                     unless $self->is_method_excluded($method_name);
             }
-
-            next;
         }
-
-        next if $self->is_method_excluded($method_name);
-
-        # it if it has one already
-        if ($role2->has_method($method_name) &&
-            # and if they are not the same thing ...
-            $role2->get_method($method_name)->body != $role1->get_method($method_name)->body) {
-            # method conflicts between roles result
-            # in the method becoming a requirement
-            $role2->add_conflicting_method(
-                name  => $method_name,
-                roles => [$role1->name, $role2->name],
-            );
-        }
-        else {
-            # add it, although it could be overridden
-            $role2->add_method(
-                $method_name,
-                $role1->get_method($method_name)
-            );
-
-        }
-
     }
 }
 
@@ -214,9 +208,7 @@ Moose::Meta::Role::Application::ToRole - Compose a role into another role
 
 =head1 BUGS
 
-All complex software has bugs lurking in it, and this module is no
-exception. If you find a bug please either email me, or add the bug
-to cpan-RT.
+See L<Moose/BUGS> for details on reporting bugs.
 
 =head1 AUTHOR
 
@@ -224,7 +216,7 @@ Stevan Little E<lt>stevan@iinteractive.comE<gt>
 
 =head1 COPYRIGHT AND LICENSE
 
-Copyright 2006-2009 by Infinity Interactive, Inc.
+Copyright 2006-2010 by Infinity Interactive, Inc.
 
 L<http://www.iinteractive.com>