remove trailing whitespace
[gitmo/Moose.git] / t / 030_roles / 010_run_time_role_composition.t
CommitLineData
d7c04559 1#!/usr/bin/perl
2
3use strict;
4use warnings;
5
b02f817d 6use Test::More tests => 27;
d7c04559 7
8use Scalar::Util qw(blessed);
9
7ff56534 10
d7c04559 11
12=pod
13
14This test can be used as a basis for the runtime role composition.
d03bd989 15Apparently it is not as simple as just making an anon class. One of
d7c04559 16the problems is the way that anon classes are DESTROY-ed, which is
17not very compatible with how instances are dealt with.
18
b805c70c 19=cut
20
d7c04559 21{
22 package Bark;
23 use Moose::Role;
24
25 sub talk { 'woof' }
26
27 package Sleeper;
28 use Moose::Role;
29
30 sub sleep { 'snore' }
31 sub talk { 'zzz' }
32
33 package My::Class;
34 use Moose;
35
36 sub sleep { 'nite-nite' }
37}
38
39my $obj = My::Class->new;
d03bd989 40isa_ok($obj, 'My::Class');
41
d71ba374 42my $obj2 = My::Class->new;
d03bd989 43isa_ok($obj2, 'My::Class');
d7c04559 44
45{
d71ba374 46 ok(!$obj->can( 'talk' ), "... the role is not composed yet");
d03bd989 47
d7c04559 48 ok(!$obj->does('Bark'), '... we do not do any roles yet');
d03bd989 49
d7c04559 50 Bark->meta->apply($obj);
51
52 ok($obj->does('Bark'), '... we now do the Bark role');
d03bd989 53 ok(!My::Class->does('Bark'), '... the class does not do the Bark role');
d7c04559 54
55 isa_ok($obj, 'My::Class');
b805c70c 56 isnt(blessed($obj), 'My::Class', '... but it is no longer blessed into My::Class');
d7c04559 57
58 ok(!My::Class->can('talk'), "... the role is not composed at the class level");
59 ok($obj->can('talk'), "... the role is now composed at the object level");
d03bd989 60
d7c04559 61 is($obj->talk, 'woof', '... got the right return value for the newly composed method');
62}
63
64{
d71ba374 65 ok(!$obj2->does('Bark'), '... we do not do any roles yet');
d03bd989 66
d71ba374 67 Bark->meta->apply($obj2);
d03bd989 68
d71ba374 69 ok($obj2->does('Bark'), '... we now do the Bark role');
70 is(blessed($obj), blessed($obj2), '... they share the same anon-class/role thing');
71}
72
73{
d7c04559 74 is($obj->sleep, 'nite-nite', '... the original method responds as expected');
75
b805c70c 76 ok(!$obj->does('Sleeper'), '... we do not do the Sleeper role');
d7c04559 77
78 Sleeper->meta->apply($obj);
79
80 ok($obj->does('Bark'), '... we still do the Bark role');
d03bd989 81 ok($obj->does('Sleeper'), '... we now do the Sleeper role too');
82
83 ok(!My::Class->does('Sleeper'), '... the class does not do the Sleeper role');
84
85 isnt(blessed($obj), blessed($obj2), '... they no longer share the same anon-class/role thing');
86
d7c04559 87 isa_ok($obj, 'My::Class');
88
89 is(My::Class->sleep, 'nite-nite', '... the original method still responds as expected');
90
91 is($obj->sleep, 'snore', '... got the right return value for the newly composed method');
d03bd989 92 is($obj->talk, 'zzz', '... got the right return value for the newly composed method');
d7c04559 93}
d71ba374 94
95{
96 ok(!$obj2->does('Sleeper'), '... we do not do any roles yet');
d03bd989 97
d71ba374 98 Sleeper->meta->apply($obj2);
d03bd989 99
d71ba374 100 ok($obj2->does('Sleeper'), '... we now do the Bark role');
101 is(blessed($obj), blessed($obj2), '... they share the same anon-class/role thing again');
102}
103
b02f817d 104
105
106