search spec components factored out of T365
[catagits/Reaction.git] / lib / Reaction / Role.pm
1 package Reaction::Role;
2
3 use Moose::Role ();
4 use Reaction::ClassExporter;
5 use Reaction::Class;
6 use Moose::Meta::Class;
7
8 #TODO: review for Reaction::Object switch / Reaction::Meta::Class
9
10 use namespace::clean -except => [ qw(meta) ];
11
12
13 override exports_for_package => sub {
14   my ($self, $package) = @_;
15   my %exports = $self->SUPER::exports_for_package($package);
16   delete $exports{class};
17   $exports{role} = sub { $self->do_role_sub($package, @_); };
18   return %exports;
19 };
20
21 override next_import_package => sub { 'Moose::Role' };
22
23 override default_base => sub { () };
24
25 override add_method_to_target => sub {
26   my ($self, $target, $method) = @_;
27   $target->meta->alias_method(@$method);
28 };
29 sub do_role_sub {
30   my ($self, $package, $role, $which, $setup) = @_;
31   confess "Invalid role declaration, should be: role Role which { ... }"
32     unless ($which eq 'which' && ref($setup) eq 'CODE');
33   $self->setup_and_cleanup($role, $setup);
34 };
35
36 __PACKAGE__->meta->make_immutable;
37
38
39 1;
40
41 =head1 NAME
42
43 Reaction::Role
44
45 =head1 DESCRIPTION
46
47 =head1 SEE ALSO
48
49 L<Moose::Role>
50
51 =head1 AUTHORS
52
53 See L<Reaction::Class> for authors.
54
55 =head1 LICENSE
56
57 See L<Reaction::Class> for the license.
58
59 =cut