check requires before installing modifiers
[gitmo/Role-Tiny.git] / lib / Role / Tiny.pm
index f0f5d76..21688d4 100644 (file)
@@ -74,12 +74,11 @@ 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 {
   my ($me, $to, $role) = @_;
-  return if our $SKIP_APPLY;
 
   _load_module($role);
 
@@ -196,19 +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);
     }
   }
-  if ($me ne __PACKAGE__
-      and $me->can('apply_single_role_to_package')
-        != \&apply_single_role_to_package) {
-    # backcompat: allow subclasses to use apply_single_role_to_package
-    # to apply changes.  set a local var so ours does nothing.
-    local our $SKIP_APPLY = 1;
-    foreach my $role (@roles) {
-      $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;