bump version to 0.79
[gitmo/Moose.git] / lib / Moose / Meta / Role / Application / ToClass.pm
index 798ae51..7f0d986 100644 (file)
@@ -5,18 +5,33 @@ use warnings;
 use metaclass;
 
 use Moose::Util  'english_list';
-use Scalar::Util 'blessed';
+use Scalar::Util 'weaken', 'blessed';
 
-our $VERSION   = '0.63';
+our $VERSION   = '0.79';
 $VERSION = eval $VERSION;
 our $AUTHORITY = 'cpan:STEVAN';
 
 use base 'Moose::Meta::Role::Application';
 
+__PACKAGE__->meta->add_attribute('role' => (
+    reader => 'role',
+));
+
+__PACKAGE__->meta->add_attribute('class' => (
+    reader => 'class',
+));
+
 sub apply {
-    my ($self, $role, $class) = @_;    
+    my ($self, $role, $class) = @_;
+
+    # We need weak_ref in CMOP :(
+    weaken($self->{role}  = $role);
+    weaken($self->{class} = $class);
+
     $self->SUPER::apply($role, $class);
-    $class->add_role($role);        
+
+    $class->add_role($role);
+    $class->add_role_application($self);
 }
 
 sub check_role_exclusions {
@@ -46,37 +61,14 @@ sub check_required_methods {
     foreach my $required_method_name ($role->get_required_method_list) {
 
         if (!$class->find_method_by_name($required_method_name)) {
-            
+
             next if $self->is_aliased_method($required_method_name);
 
             push @missing, $required_method_name;
         }
-        else {
-            # NOTE:
-            # we need to make sure that the method is
-            # not a method modifier, because those do
-            # not satisfy the requirements ...
-            my $method = $class->find_method_by_name($required_method_name);
-
-            # check if it is a generated accessor ...
-            push @is_attr, $required_method_name,
-                if $method->isa('Class::MOP::Method::Accessor');
-
-            # NOTE:
-            # All other tests here have been removed, they were tests
-            # for overriden methods and before/after/around modifiers.
-            # But we realized that for classes any overriden or modified
-            # methods would be backed by a real method of that name
-            # (and therefore meet the requirement). And for roles, the
-            # overriden and modified methods are "in statis" and so would
-            # not show up in this test anyway (and as a side-effect they
-            # would not fufill the requirement, which is exactly what we
-            # want them to do anyway).
-            # - SL
-        }
     }
 
-    return unless @missing || @is_attr;
+    return unless @missing;
 
     my $error = '';
 
@@ -94,28 +86,11 @@ sub check_required_methods {
             . $class->name . q{'};
     }
 
-    if (@is_attr) {
-        my $noun = @is_attr == 1 ? 'method' : 'methods';
-
-        my $list
-            = Moose::Util::english_list( map { q{'} . $_ . q{'} } @is_attr );
-
-        $error .= "\n" if length $error;
-
-        $error
-            .= q{'}
-            . $role->name
-            . "' requires the $noun $list "
-            . "to be implemented by '"
-            . $class->name
-            . "' but the method is only an attribute accessor";
-    }
-
     $class->throw_error($error);
 }
 
 sub check_required_attributes {
-    
+
 }
 
 sub apply_attributes {
@@ -139,7 +114,7 @@ sub apply_attributes {
 sub apply_methods {
     my ($self, $role, $class) = @_;
     foreach my $method_name ($role->get_method_list) {
-        
+
         unless ($self->is_method_excluded($method_name)) {
             # it if it has one already
             if ($class->has_method($method_name) &&
@@ -148,14 +123,14 @@ sub apply_methods {
                 next;
             }
             else {
-                # add it, although it could be overriden
+                # add it, although it could be overridden
                 $class->add_method(
                     $method_name,
                     $role->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
@@ -163,17 +138,17 @@ sub apply_methods {
                 # and if they are not the same thing ...
                 $class->get_method($aliased_method_name)->body != $role->get_method($method_name)->body) {
                 $class->throw_error("Cannot create a method alias if a local method of the same name exists");
-            }            
+            }
             $class->add_method(
                 $aliased_method_name,
                 $role->get_method($method_name)
-            );                
-        }        
+            );
+        }
     }
     # we must reset the cache here since
     # we are just aliasing methods, otherwise
     # the modifiers go wonky.
-    $class->reset_package_cache_flag;        
+    $class->reset_package_cache_flag;
 }
 
 sub apply_override_method_modifiers {
@@ -258,7 +233,7 @@ Stevan Little E<lt>stevan@iinteractive.comE<gt>
 
 =head1 COPYRIGHT AND LICENSE
 
-Copyright 2006-2008 by Infinity Interactive, Inc.
+Copyright 2006-2009 by Infinity Interactive, Inc.
 
 L<http://www.iinteractive.com>