check requires before installing modifiers
[gitmo/Role-Tiny.git] / lib / Role / Tiny.pm
index 78147a5..21688d4 100644 (file)
@@ -74,7 +74,7 @@ sub import {
 }
 
 sub role_application_steps {
-  qw(_install_methods _install_modifiers _check_requires _copy_applied_list);
+  qw(_install_methods _check_requires _install_modifiers _copy_applied_list);
 }
 
 sub apply_single_role_to_package {
@@ -195,9 +195,27 @@ sub apply_roles_to_package {
   if ($INFO{$to}) {
     delete $INFO{$to}{methods}; # reset since we're about to add methods
   }
-  foreach my $step ($me->role_application_steps) {
+
+  # backcompat: allow subclasses to use apply_single_role_to_package
+  # to apply changes.  set a local var so ours does nothing.
+  our %BACKCOMPAT_HACK;
+  if($me ne __PACKAGE__
+      and exists $BACKCOMPAT_HACK{$me} ? $BACKCOMPAT_HACK{$me} :
+      $BACKCOMPAT_HACK{$me} =
+        $me->can('role_application_steps')
+          == \&role_application_steps
+        && $me->can('apply_single_role_to_package')
+          != \&apply_single_role_to_package
+  ) {
     foreach my $role (@roles) {
-      $me->$step($to, $role);
+      $me->apply_single_role_to_package($to, $role);
+    }
+  }
+  else {
+    foreach my $step ($me->role_application_steps) {
+      foreach my $role (@roles) {
+        $me->$step($to, $role);
+      }
     }
   }
   $APPLIED_TO{$to}{join('|',@roles)} = 1;