fcf446054b10e0a5650c52cbb50b2522cfdd6289
[gitmo/MooseX-Role-Parameterized.git] / t / 150-composite-role-application.t
1 #!/usr/bin/env perl
2 use strict;
3 use warnings;
4
5 use Test::More tests => 6;
6 use Test::Exception;
7
8 do {
9     package MyCompositeRoleA;
10     use MooseX::Role::Parameterized;
11
12     parameter attribute => (
13         isa => 'Str',
14         required => 1,
15     );
16
17     role {
18         my $p = shift;
19
20         has $p->attribute => (
21             is => 'Int',
22         );
23     };
24 };
25
26 do {
27     package MyCompositeRoleB;
28     use MooseX::Role::Parameterized;
29
30     parameter accessor => (
31         isa => 'Str',
32         required => 1,
33     );
34
35     role {
36         my $p = shift;
37
38         has $p->accessor => (
39             is => 'rw',
40             isa => 'Int',
41         );
42     };
43 };
44
45 do {
46     package MyDoubleConsumer;
47     use Moose;
48     with MyCompositeRoleA => { attribute => 'foo' },
49          MyCompositeRoleB => { accessor  => 'bar' };
50 };
51
52 TODO: {
53     local $TODO = "role-role application for parameterized roles doesn't work yet";
54     ok(MyDoubleConsumer->can('foo'), 'first role in composite applied successfully');
55     ok(MyDoubleConsumer->can('bar'), 'second role in composite applied successfully');
56 };
57
58 do {
59     package MyExtendingRole;
60     use MooseX::Role::Parameterized;
61
62     parameter foo => (
63         isa => 'Int',
64     );
65
66     role {
67         my $p = shift;
68
69         with 'MyCompositeRoleA', { attribute => 'bar' };
70
71         has foo => (
72             is => 'rw',
73             default => sub { $p->foo },
74         );
75     };
76 };
77
78 do {
79     package MyExtendedConsumer;
80     use Moose;
81     with MyCompositeRoleA => { attribute => 'bar' },
82          MyExtendingRole  => { foo => 23 };
83 };
84
85 TODO: {
86     local $TODO = "role-role application for parameterized roles doesn't work yet";
87     ok(MyExtendedConsumer->can('bar'), 'role composed through other role applied successfully');
88     is(eval { MyExtendedConsumer->new->foo }, 23, 'role composing other role applied successfully');
89 };;
90
91 do {
92     package MyRoleProxy;
93     use MooseX::Role::Parameterized;
94
95     parameter rolename   => (isa => "Str");
96     parameter roleparams => (isa => "HashRef");
97
98     role {
99         my $p = shift;
100
101         with $p->rolename, $p->roleparams;
102     };
103 };
104
105 do {
106     package MyProxyConsumer;
107     use Moose;
108     with(
109         MyRoleProxy => { 
110             rolename   => 'MyCompositeRoleA',
111             roleparams => { attribute => 'baz' },
112         },
113         MyCompositeRoleB => {
114             accessor => 'qux',
115         },
116     );
117 };
118
119 TODO: {
120     local $TODO = "role-role application for parameterized roles doesn't work yet";
121     ok(MyProxyConsumer->can('baz'), 'proxied role got applied successfully');
122     ok(MyProxyConsumer->can('qux'), 'other role besides proxied one got applied successfully');
123 };
124