|
Packit |
73b376 |
use strict;
|
|
Packit |
73b376 |
use warnings;
|
|
Packit |
73b376 |
use Test::More;
|
|
Packit |
73b376 |
|
|
Packit |
73b376 |
my $backcompat_called;
|
|
Packit |
73b376 |
{
|
|
Packit |
73b376 |
package RoleExtension;
|
|
Packit |
73b376 |
use base 'Role::Tiny';
|
|
Packit |
73b376 |
|
|
Packit |
73b376 |
sub apply_single_role_to_package {
|
|
Packit |
73b376 |
my $me = shift;
|
|
Packit |
73b376 |
$me->SUPER::apply_single_role_to_package(@_);
|
|
Packit |
73b376 |
$backcompat_called++;
|
|
Packit |
73b376 |
}
|
|
Packit |
73b376 |
}
|
|
Packit |
73b376 |
{
|
|
Packit |
73b376 |
package RoleExtension2;
|
|
Packit |
73b376 |
use base 'Role::Tiny';
|
|
Packit |
73b376 |
|
|
Packit |
73b376 |
sub role_application_steps {
|
|
Packit |
73b376 |
$_[0]->SUPER::role_application_steps;
|
|
Packit |
73b376 |
}
|
|
Packit |
73b376 |
|
|
Packit |
73b376 |
sub apply_single_role_to_package {
|
|
Packit |
73b376 |
my $me = shift;
|
|
Packit |
73b376 |
$me->SUPER::apply_single_role_to_package(@_);
|
|
Packit |
73b376 |
$backcompat_called++;
|
|
Packit |
73b376 |
}
|
|
Packit |
73b376 |
|
|
Packit |
73b376 |
}
|
|
Packit |
73b376 |
|
|
Packit |
73b376 |
{
|
|
Packit |
73b376 |
package Role1;
|
|
Packit |
73b376 |
$INC{'Role1.pm'} = __FILE__;
|
|
Packit |
73b376 |
use Role::Tiny;
|
|
Packit |
73b376 |
sub sub1 {}
|
|
Packit |
73b376 |
}
|
|
Packit |
73b376 |
|
|
Packit |
73b376 |
{
|
|
Packit |
73b376 |
package Role2;
|
|
Packit |
73b376 |
$INC{'Role2.pm'} = __FILE__;
|
|
Packit |
73b376 |
use Role::Tiny;
|
|
Packit |
73b376 |
sub sub2 {}
|
|
Packit |
73b376 |
}
|
|
Packit |
73b376 |
|
|
Packit |
73b376 |
{
|
|
Packit |
73b376 |
package Class1;
|
|
Packit |
73b376 |
RoleExtension->apply_roles_to_package(__PACKAGE__, 'Role1', 'Role2');
|
|
Packit |
73b376 |
}
|
|
Packit |
73b376 |
|
|
Packit |
73b376 |
is $backcompat_called, 2,
|
|
Packit |
73b376 |
'overridden apply_single_role_to_package called for backcompat';
|
|
Packit |
73b376 |
|
|
Packit |
73b376 |
$backcompat_called = 0;
|
|
Packit |
73b376 |
{
|
|
Packit |
73b376 |
package Class2;
|
|
Packit |
73b376 |
RoleExtension2->apply_roles_to_package(__PACKAGE__, 'Role1', 'Role2');
|
|
Packit |
73b376 |
}
|
|
Packit |
73b376 |
is $backcompat_called, 0,
|
|
Packit |
73b376 |
'overridden role_application_steps prevents backcompat attempt';
|
|
Packit |
73b376 |
|
|
Packit |
73b376 |
{
|
|
Packit |
73b376 |
package RoleExtension3;
|
|
Packit |
73b376 |
use base 'Role::Tiny';
|
|
Packit |
73b376 |
|
|
Packit |
73b376 |
sub _composable_package_for {
|
|
Packit |
73b376 |
my ($self, $role) = @_;
|
|
Packit |
73b376 |
my $composed_name = 'Role::Tiny::_COMPOSABLE::'.$role;
|
|
Packit |
73b376 |
return $composed_name if $Role::Tiny::COMPOSED{role}{$composed_name};
|
|
Packit |
73b376 |
no strict 'refs';
|
|
Packit |
73b376 |
*{"${composed_name}::extra_sub"} = sub {};
|
|
Packit |
73b376 |
$self->SUPER::_composable_package_for($role);
|
|
Packit |
73b376 |
}
|
|
Packit |
73b376 |
}
|
|
Packit |
73b376 |
|
|
Packit |
73b376 |
{
|
|
Packit |
73b376 |
package Class2;
|
|
Packit |
73b376 |
sub foo {}
|
|
Packit |
73b376 |
}
|
|
Packit |
73b376 |
{
|
|
Packit |
73b376 |
package Role3;
|
|
Packit |
73b376 |
$INC{'Role3.pm'} = __FILE__;
|
|
Packit |
73b376 |
use Role::Tiny;
|
|
Packit |
73b376 |
requires 'extra_sub';
|
|
Packit |
73b376 |
}
|
|
Packit |
73b376 |
ok eval { RoleExtension3->create_class_with_roles('Class2', 'Role3') },
|
|
Packit |
73b376 |
'requires is satisfied by subs generated by _composable_package_for';
|
|
Packit |
73b376 |
|
|
Packit |
73b376 |
{
|
|
Packit |
73b376 |
package Role4;
|
|
Packit |
73b376 |
$INC{'Role4.pm'} = __FILE__;
|
|
Packit |
73b376 |
use Role::Tiny;
|
|
Packit |
73b376 |
requires 'extra_sub2';
|
|
Packit |
73b376 |
}
|
|
Packit |
73b376 |
ok !eval { RoleExtension3->create_class_with_roles('Class2', 'Role4'); },
|
|
Packit |
73b376 |
'requires checked properly during create_class_with_roles';
|
|
Packit |
73b376 |
|
|
Packit |
73b376 |
SKIP: {
|
|
Packit |
73b376 |
skip "Class::Method::Modifiers not installed or too old", 1
|
|
Packit |
73b376 |
unless eval "use Class::Method::Modifiers 1.05; 1";
|
|
Packit |
73b376 |
package Role5;
|
|
Packit |
73b376 |
$INC{'Role5.pm'} = __FILE__;
|
|
Packit |
73b376 |
use Role::Tiny;
|
|
Packit |
73b376 |
around extra_sub2 => sub { my $orig = shift; $orig->(@_); };
|
|
Packit |
73b376 |
|
|
Packit |
73b376 |
::ok !eval { RoleExtension3->create_class_with_roles('Class3', 'Role4'); },
|
|
Packit |
73b376 |
'requires checked properly during create_class_with_roles';
|
|
Packit |
73b376 |
}
|
|
Packit |
73b376 |
|
|
Packit |
73b376 |
done_testing;
|