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