2 use warnings FATAL => 'all';
11 requires qw(req1 req2);
13 around foo => sub { my $orig = shift; join ' ', 'role foo', $orig->(@_) };
15 sub bar { 'role bar' }
17 sub baz { 'role baz' }
23 use constant SIMPLE => 'simple';
24 use constant REF_CONST => [ 'ref_const' ];
25 use constant VSTRING_CONST => v1;
29 sub foo { 'class foo' }
30 sub baz { 'class baz' }
40 sub baz { 'class baz' }
44 package IntermediaryRole;
61 sub extra1 { 'role extra' }
68 around 'broken modifier' => sub { my $orig = shift; $orig->(@_) };
73 exception { Role::Tiny->apply_role_to_package($to, 'MyRole') }
76 is(try_apply_to('MyClass'), undef, 'role applies cleanly');
77 is(MyClass->foo, 'role foo class foo', 'method modifier');
78 is(MyClass->bar, 'role bar', 'method from role');
79 is(MyClass->baz, 'class baz', 'method from class');
80 ok(MyClass->does('MyRole'), 'class does role');
81 ok(!MyClass->does('IntermediaryRole'), 'class does not do non-applied role');
82 ok(!MyClass->does('Random'), 'class does not do non-role');
84 like(try_apply_to('NoMethods'), qr/req1, req2/, 'error for both methods');
85 like(try_apply_to('OneMethod'), qr/req2/, 'error for one method');
88 Role::Tiny->apply_role_to_package('IntermediaryRole', 'MyRole');
89 Role::Tiny->apply_role_to_package('ExtraClass', 'IntermediaryRole');
90 }, undef, 'No errors applying roles';
92 ok(ExtraClass->does('MyRole'), 'ExtraClass does MyRole');
93 ok(ExtraClass->does('IntermediaryRole'), 'ExtraClass does IntermediaryRole');
94 is(ExtraClass->bar, 'role bar', 'method from role');
95 is(ExtraClass->baz, 'class baz', 'method from class');
99 $new_class = Role::Tiny->create_class_with_roles('MyClass', 'ExtraRole');
100 }, undef, 'No errors creating class with roles';
102 isa_ok($new_class, 'MyClass');
103 is($new_class->extra1, 'role extra', 'method from role');
106 $new_class = Role::Tiny->create_class_with_roles('MyClass', 'BrokenRole');
107 }, 'exception caught creating class with broken modifier in a role');