701309409d4764d3ae1d7eb75532658a178fcbf6
[gitmo/Moose.git] / lib / Moose / Meta / Role / Application.pm
1 package Moose::Meta::Role::Application;
2
3 use strict;
4 use warnings;
5 use metaclass;
6
7 our $VERSION   = '1.16';
8 $VERSION = eval $VERSION;
9 our $AUTHORITY = 'cpan:STEVAN';
10
11 __PACKAGE__->meta->add_attribute('method_exclusions' => (
12     init_arg => '-excludes',
13     reader   => 'get_method_exclusions',
14     default  => sub { [] }
15 ));
16
17 __PACKAGE__->meta->add_attribute('method_aliases' => (
18     init_arg => '-alias',
19     reader   => 'get_method_aliases',
20     default  => sub { {} }
21 ));
22
23 __PACKAGE__->meta->add_attribute('fire_alias_excludes_warning' => (
24     init_arg => 'fire_alias_excludes_warning',
25     reader => 'fire_alias_excludes_warning',
26     default => 0
27 ));
28
29 sub new {
30     my ($class, %params) = @_;
31
32     if ( exists $params{excludes} || exists $params{alias} ) {
33         $params{fire_alias_excludes_warning} = 1;
34     }
35
36     if ( exists $params{excludes} && !exists $params{'-excludes'} ) {
37         $params{'-excludes'} = delete $params{excludes};
38     }
39     if ( exists $params{alias} && !exists $params{'-alias'} ) {
40         $params{'-alias'} = delete $params{alias};
41     }
42
43     if ( exists $params{'-excludes'} ) {
44
45         # I wish we had coercion here :)
46         $params{'-excludes'} = (
47             ref $params{'-excludes'} eq 'ARRAY'
48             ? $params{'-excludes'}
49             : [ $params{'-excludes'} ]
50         );
51     }
52
53     $class->_new(\%params);
54 }
55
56 sub is_method_excluded {
57     my ($self, $method_name) = @_;
58     foreach (@{$self->get_method_exclusions}) {
59         return 1 if $_ eq $method_name;
60     }
61     return 0;
62 }
63
64 sub is_method_aliased {
65     my ($self, $method_name) = @_;
66     exists $self->get_method_aliases->{$method_name} ? 1 : 0
67 }
68
69 sub is_aliased_method {
70     my ($self, $method_name) = @_;
71     my %aliased_names = reverse %{$self->get_method_aliases};
72     exists $aliased_names{$method_name} ? 1 : 0;
73 }
74
75 sub apply {
76     my $self = shift;
77
78     if ($self->fire_alias_excludes_warning) {
79         Moose::Deprecated::deprecated(
80             feature => 'alias or excludes',
81             message =>
82                 "The alias and excludes options for role application have been renamed -alias and -excludes (applying ${\$_[0]->name} to ${\$_[1]->name} - do you need to upgrade ${\$_[1]->name}?)"
83         );
84     }
85
86     $self->check_role_exclusions(@_);
87     $self->check_required_methods(@_);
88     $self->check_required_attributes(@_);
89
90     $self->apply_attributes(@_);
91     $self->apply_methods(@_);
92
93     $self->apply_override_method_modifiers(@_);
94
95     $self->apply_before_method_modifiers(@_);
96     $self->apply_around_method_modifiers(@_);
97     $self->apply_after_method_modifiers(@_);
98 }
99
100 sub check_role_exclusions           { Carp::croak "Abstract Method" }
101 sub check_required_methods          { Carp::croak "Abstract Method" }
102 sub check_required_attributes       { Carp::croak "Abstract Method" }
103
104 sub apply_attributes                { Carp::croak "Abstract Method" }
105 sub apply_methods                   { Carp::croak "Abstract Method" }
106 sub apply_override_method_modifiers { Carp::croak "Abstract Method" }
107 sub apply_method_modifiers          { Carp::croak "Abstract Method" }
108
109 sub apply_before_method_modifiers   { (shift)->apply_method_modifiers('before' => @_) }
110 sub apply_around_method_modifiers   { (shift)->apply_method_modifiers('around' => @_) }
111 sub apply_after_method_modifiers    { (shift)->apply_method_modifiers('after'  => @_) }
112
113 1;
114
115 __END__
116
117 =pod
118
119 =head1 NAME
120
121 Moose::Meta::Role::Application - A base class for role application
122
123 =head1 DESCRIPTION
124
125 This is the abstract base class for role applications.
126
127 The API for this class and its subclasses still needs some
128 consideration, and is intentionally not yet documented.
129
130 =head2 METHODS
131
132 =over 4
133
134 =item B<new>
135
136 =item B<meta>
137
138 =item B<get_method_exclusions>
139
140 =item B<is_method_excluded>
141
142 =item B<get_method_aliases>
143
144 =item B<is_aliased_method>
145
146 =item B<is_method_aliased>
147
148 =item B<apply>
149
150 =item B<check_role_exclusions>
151
152 =item B<check_required_methods>
153
154 =item B<check_required_attributes>
155
156 =item B<apply_attributes>
157
158 =item B<apply_methods>
159
160 =item B<apply_method_modifiers>
161
162 =item B<apply_before_method_modifiers>
163
164 =item B<apply_after_method_modifiers>
165
166 =item B<apply_around_method_modifiers>
167
168 =item B<apply_override_method_modifiers>
169
170 =back
171
172 =head1 BUGS
173
174 See L<Moose/BUGS> for details on reporting bugs.
175
176 =head1 AUTHOR
177
178 Stevan Little E<lt>stevan@iinteractive.comE<gt>
179
180 =head1 COPYRIGHT AND LICENSE
181
182 Copyright 2006-2010 by Infinity Interactive, Inc.
183
184 L<http://www.iinteractive.com>
185
186 This library is free software; you can redistribute it and/or modify
187 it under the same terms as Perl itself.
188
189 =cut
190