DEATH TO ALL zionist ELLIPSES
[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
1808c2da 48 ok(!$obj->does('Bark'), 'we do not do any roles yet');
d03bd989 49
d7c04559 50 Bark->meta->apply($obj);
51
1808c2da 52 ok($obj->does('Bark'), 'we now do the Bark role');
53 ok(!My::Class->does('Bark'), 'the class does not do the Bark role');
d7c04559 54
55 isa_ok($obj, 'My::Class');
1808c2da 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
1808c2da 61 is($obj->talk, 'woof', 'got the right return value for the newly composed method');
d7c04559 62}
63
64{
1808c2da 65 ok(!$obj2->does('Bark'), 'we do not do any roles yet');
d03bd989 66
d71ba374 67 Bark->meta->apply($obj2);
d03bd989 68
1808c2da 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');
d71ba374 71}
72
73{
1808c2da 74 is($obj->sleep, 'nite-nite', 'the original method responds as expected');
d7c04559 75
1808c2da 76 ok(!$obj->does('Sleeper'), 'we do not do the Sleeper role');
d7c04559 77
78 Sleeper->meta->apply($obj);
79
1808c2da 80 ok($obj->does('Bark'), 'we still do the Bark role');
81 ok($obj->does('Sleeper'), 'we now do the Sleeper role too');
d03bd989 82
1808c2da 83 ok(!My::Class->does('Sleeper'), 'the class does not do the Sleeper role');
d03bd989 84
1808c2da 85 isnt(blessed($obj), blessed($obj2), 'they no longer share the same anon-class/role thing');
d03bd989 86
d7c04559 87 isa_ok($obj, 'My::Class');
88
1808c2da 89 is(My::Class->sleep, 'nite-nite', 'the original method still responds as expected');
d7c04559 90
1808c2da 91 is($obj->sleep, 'snore', 'got the right return value for the newly composed method');
92 is($obj->talk, 'zzz', 'got the right return value for the newly composed method');
d7c04559 93}
d71ba374 94
95{
1808c2da 96 ok(!$obj2->does('Sleeper'), 'we do not do any roles yet');
d03bd989 97
d71ba374 98 Sleeper->meta->apply($obj2);
d03bd989 99
1808c2da 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');
d71ba374 102}
103
b02f817d 104
105
106