}
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 {
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;