8 package CustomApplication;
10 after apply_methods => sub {
11 my ($self, $role, $other) = @_;
12 $self->apply_custom($role, $other);
17 push @applications, [@_];
22 package CustomApplication::ToClass;
24 with 'CustomApplication';
28 package CustomApplication::ToRole;
30 with 'CustomApplication';
34 package CustomApplication::ToInstance;
36 with 'CustomApplication';
40 package CustomApplication::Composite;
42 with 'CustomApplication';
43 around apply_custom => sub {
44 my ($next, $self, $composite, $other) = @_;
45 for my $role (@{ $composite->get_roles }) {
46 $self->$next($role, $other);
52 package CustomApplication::Composite::ToClass;
54 with 'CustomApplication::Composite';
58 package CustomApplication::Composite::ToRole;
60 with 'CustomApplication::Composite';
64 package CustomApplication::Composite::ToInstance;
66 with 'CustomApplication::Composite';
70 package Role::Composite;
72 around apply_params => sub {
73 my ($next, $self, @args) = @_;
74 return Moose::Util::MetaRole::apply_metaclass_roles(
75 for_class => $self->$next(@args),
76 application_to_class_class_roles => [ 'CustomApplication::Composite::ToClass' ],
77 application_to_role_class_roles => [ 'CustomApplication::Composite::ToRole' ],
78 application_to_instance_class_roles => [ 'CustomApplication::Composite::ToInstance' ],
84 package Role::WithCustomApplication;
86 has '+composition_class_roles' => (
87 default => [ 'Role::Composite' ],
93 Moose::Exporter->setup_import_methods(
94 also => 'Moose::Role',
98 my ($self, %options) = @_;
99 return Moose::Util::MetaRole::apply_metaclass_roles(
100 for_class => Moose::Role->init_meta(%options),
101 metaclass_roles => [ 'Role::WithCustomApplication' ],
102 application_to_class_class_roles => [ 'CustomApplication::ToClass' ],
103 application_to_role_class_roles => [ 'CustomApplication::ToRole' ],
104 application_to_instance_class_roles => [ 'CustomApplication::ToInstance' ],
110 package My::Role::Normal;
115 package My::Role::Special;
119 ok(My::Role::Normal->meta->isa('Moose::Meta::Role'), "sanity check");
120 ok(My::Role::Special->meta->isa('Moose::Meta::Role'), "using custom application roles does not change the role metaobject's class");
121 ok(My::Role::Special->meta->meta->does_role('Role::WithCustomApplication'), "the role's metaobject has custom applications");
122 is_deeply(My::Role::Special->meta->composition_class_roles, ['Role::Composite'], "the role knows about the specified composition class");
128 with 'My::Role::Special';
129 ::is(@applications, 1, 'one role application');
130 ::is($applications[0]->[0]->name, 'My::Role::Special', "the application's first role was My::Role::Special'");
131 ::is($applications[0]->[1]->name, 'Foo', "the application provided an additional role");
138 with 'My::Role::Special';
139 ::is(@applications, 1);
140 ::is($applications[0]->[0]->name, 'My::Role::Special');
141 ::is($applications[0]->[1]->name, 'Bar');
149 My::Role::Special->meta->apply($i);
150 ::is(@applications, 1);
151 ::is($applications[0]->[0]->name, 'My::Role::Special');
152 ::ok($applications[0]->[1]->is_anon_class);
153 ::ok($applications[0]->[1]->name->isa('Baz'));
160 with 'My::Role::Normal', 'My::Role::Special';
161 ::is(@applications, 2);
162 ::is($applications[0]->[0]->name, 'My::Role::Normal');
163 ::is($applications[0]->[1]->name, 'Corge');
164 ::is($applications[1]->[0]->name, 'My::Role::Special');
165 ::is($applications[1]->[1]->name, 'Corge');
172 with 'My::Role::Normal', 'My::Role::Special';
173 ::is(@applications, 2);
174 ::is($applications[0]->[0]->name, 'My::Role::Normal');
175 ::is($applications[0]->[1]->name, 'Thud');
176 ::is($applications[1]->[0]->name, 'My::Role::Special');
177 ::is($applications[1]->[1]->name, 'Thud');
185 Moose::Meta::Role->combine(
186 ['My::Role::Normal' => undef],
187 ['My::Role::Special' => undef],
189 ::is(@applications, 2);
190 ::is($applications[0]->[0]->name, 'My::Role::Normal');
191 ::ok($applications[0]->[1]->is_anon_class);
192 ::ok($applications[0]->[1]->name->isa('Garply'));
193 ::is($applications[1]->[0]->name, 'My::Role::Special');
194 ::ok($applications[1]->[1]->is_anon_class);
195 ::ok($applications[1]->[1]->name->isa('Garply'));