line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
388
|
|
|
388
|
|
17265152
|
use strict; |
|
388
|
|
|
|
|
2560
|
|
|
388
|
|
|
|
|
10878
|
|
2
|
388
|
|
|
388
|
|
1812
|
use warnings; |
|
388
|
|
|
|
|
729
|
|
|
388
|
|
|
|
|
18469
|
|
3
|
|
|
|
|
|
|
package Moose; # git description: 2.2202-3-g552dad4a6 |
4
|
|
|
|
|
|
|
our $VERSION = '2.2203'; |
5
|
|
|
|
|
|
|
our $AUTHORITY = 'cpan:STEVAN'; |
6
|
|
|
|
|
|
|
|
7
|
388
|
|
|
388
|
|
7058
|
use 5.008003; |
|
388
|
|
|
|
|
1270
|
|
8
|
|
|
|
|
|
|
|
9
|
388
|
|
|
388
|
|
2102
|
use Scalar::Util (); |
|
388
|
|
|
|
|
707
|
|
|
388
|
|
|
|
|
8144
|
|
10
|
388
|
|
|
388
|
|
1971
|
use Carp 'carp'; |
|
388
|
|
|
|
|
766
|
|
|
388
|
|
|
|
|
19784
|
|
11
|
388
|
|
|
388
|
|
87068
|
use Module::Runtime 'module_notional_filename'; |
|
388
|
|
|
|
|
306525
|
|
|
388
|
|
|
|
|
2351
|
|
12
|
388
|
|
|
388
|
|
97617
|
use Class::Load 'is_class_loaded'; |
|
388
|
|
|
|
|
2704654
|
|
|
388
|
|
|
|
|
18983
|
|
13
|
|
|
|
|
|
|
|
14
|
388
|
|
|
388
|
|
130295
|
use Moose::Deprecated; |
|
388
|
|
|
|
|
877
|
|
|
388
|
|
|
|
|
2217
|
|
15
|
388
|
|
|
388
|
|
170091
|
use Moose::Exporter; |
|
388
|
|
|
|
|
1181
|
|
|
388
|
|
|
|
|
2483
|
|
16
|
|
|
|
|
|
|
|
17
|
388
|
|
|
388
|
|
2294
|
use Class::MOP; |
|
388
|
|
|
|
|
688
|
|
|
388
|
|
|
|
|
16661
|
|
18
|
|
|
|
|
|
|
|
19
|
|
|
|
|
|
|
die "Class::MOP version $Moose::VERSION required--this is version $Class::MOP::VERSION" |
20
|
|
|
|
|
|
|
if $Class::MOP::VERSION ne $Moose::VERSION; |
21
|
|
|
|
|
|
|
|
22
|
388
|
|
|
388
|
|
185492
|
use Moose::Meta::Class; |
|
388
|
|
|
|
|
1197
|
|
|
388
|
|
|
|
|
14156
|
|
23
|
388
|
|
|
388
|
|
165895
|
use Moose::Meta::TypeConstraint; |
|
388
|
|
|
|
|
1138
|
|
|
388
|
|
|
|
|
13693
|
|
24
|
388
|
|
|
388
|
|
155740
|
use Moose::Meta::TypeCoercion; |
|
388
|
|
|
|
|
1160
|
|
|
388
|
|
|
|
|
12412
|
|
25
|
388
|
|
|
388
|
|
2533
|
use Moose::Meta::Attribute; |
|
388
|
|
|
|
|
812
|
|
|
388
|
|
|
|
|
7721
|
|
26
|
388
|
|
|
388
|
|
174291
|
use Moose::Meta::Instance; |
|
388
|
|
|
|
|
1120
|
|
|
388
|
|
|
|
|
12720
|
|
27
|
|
|
|
|
|
|
|
28
|
388
|
|
|
388
|
|
158193
|
use Moose::Object; |
|
388
|
|
|
|
|
909
|
|
|
388
|
|
|
|
|
10285
|
|
29
|
|
|
|
|
|
|
|
30
|
388
|
|
|
388
|
|
181541
|
use Moose::Meta::Role; |
|
388
|
|
|
|
|
1342
|
|
|
388
|
|
|
|
|
16046
|
|
31
|
388
|
|
|
388
|
|
174634
|
use Moose::Meta::Role::Composite; |
|
388
|
|
|
|
|
1245
|
|
|
388
|
|
|
|
|
16735
|
|
32
|
388
|
|
|
388
|
|
161314
|
use Moose::Meta::Role::Application; |
|
388
|
|
|
|
|
1124
|
|
|
388
|
|
|
|
|
13398
|
|
33
|
388
|
|
|
388
|
|
178218
|
use Moose::Meta::Role::Application::RoleSummation; |
|
388
|
|
|
|
|
1114
|
|
|
388
|
|
|
|
|
11669
|
|
34
|
388
|
|
|
388
|
|
175115
|
use Moose::Meta::Role::Application::ToClass; |
|
388
|
|
|
|
|
1092
|
|
|
388
|
|
|
|
|
13700
|
|
35
|
388
|
|
|
388
|
|
171813
|
use Moose::Meta::Role::Application::ToRole; |
|
388
|
|
|
|
|
938
|
|
|
388
|
|
|
|
|
10734
|
|
36
|
388
|
|
|
388
|
|
158104
|
use Moose::Meta::Role::Application::ToInstance; |
|
388
|
|
|
|
|
1012
|
|
|
388
|
|
|
|
|
11232
|
|
37
|
|
|
|
|
|
|
|
38
|
388
|
|
|
388
|
|
2629
|
use Moose::Util::TypeConstraints; |
|
388
|
|
|
|
|
784
|
|
|
388
|
|
|
|
|
3570
|
|
39
|
388
|
|
|
388
|
|
300816
|
use Moose::Util 'throw_exception'; |
|
388
|
|
|
|
|
893
|
|
|
388
|
|
|
|
|
2167
|
|
40
|
|
|
|
|
|
|
|
41
|
388
|
|
|
388
|
|
234790
|
use Moose::Meta::Attribute::Native; |
|
388
|
|
|
|
|
1180
|
|
|
388
|
|
|
|
|
428889
|
|
42
|
|
|
|
|
|
|
|
43
|
|
|
|
|
|
|
sub extends { |
44
|
635
|
|
|
635
|
1
|
1402
|
my $meta = shift; |
45
|
|
|
|
|
|
|
|
46
|
635
|
100
|
|
|
|
2061
|
unless ( @_ ) |
47
|
|
|
|
|
|
|
{ |
48
|
1
|
|
|
|
|
17
|
throw_exception( ExtendsMissingArgs => class_name => $meta->name ); |
49
|
|
|
|
|
|
|
} |
50
|
|
|
|
|
|
|
# this checks the metaclass to make sure |
51
|
|
|
|
|
|
|
# it is correct, sometimes it can get out |
52
|
|
|
|
|
|
|
# of sync when the classes are being built |
53
|
634
|
|
|
|
|
2738
|
$meta->superclasses(@_); |
54
|
|
|
|
|
|
|
} |
55
|
|
|
|
|
|
|
|
56
|
|
|
|
|
|
|
sub with { |
57
|
555
|
|
|
555
|
1
|
4677
|
Moose::Util::apply_all_roles(shift, @_); |
58
|
|
|
|
|
|
|
} |
59
|
|
|
|
|
|
|
|
60
|
|
|
|
|
|
|
sub throw_error { |
61
|
2
|
|
|
2
|
0
|
348
|
shift; |
62
|
2
|
|
|
|
|
14
|
Class::MOP::Object->throw_error(@_); |
63
|
|
|
|
|
|
|
} |
64
|
|
|
|
|
|
|
|
65
|
|
|
|
|
|
|
sub has { |
66
|
1513
|
|
|
1513
|
1
|
3615
|
my $meta = shift; |
67
|
1513
|
|
|
|
|
2508
|
my $name = shift; |
68
|
|
|
|
|
|
|
|
69
|
1513
|
|
|
|
|
5130
|
my %context = Moose::Util::_caller_info; |
70
|
1513
|
|
|
|
|
4248
|
$context{context} = 'has declaration'; |
71
|
1513
|
|
|
|
|
2921
|
$context{type} = 'class'; |
72
|
1513
|
|
|
|
|
5097
|
my @options = ( definition_context => \%context, @_ ); |
73
|
1513
|
100
|
|
|
|
5132
|
my $attrs = ( ref($name) eq 'ARRAY' ) ? $name : [ ($name) ]; |
74
|
1513
|
|
|
|
|
7088
|
$meta->add_attribute( $_, @options ) for @$attrs; |
75
|
|
|
|
|
|
|
} |
76
|
|
|
|
|
|
|
|
77
|
|
|
|
|
|
|
sub before { |
78
|
9
|
|
|
9
|
1
|
60
|
Moose::Util::add_method_modifier(shift, 'before', \@_); |
79
|
|
|
|
|
|
|
} |
80
|
|
|
|
|
|
|
|
81
|
|
|
|
|
|
|
sub after { |
82
|
6
|
|
|
6
|
1
|
35
|
Moose::Util::add_method_modifier(shift, 'after', \@_); |
83
|
|
|
|
|
|
|
} |
84
|
|
|
|
|
|
|
|
85
|
|
|
|
|
|
|
sub around { |
86
|
9
|
|
|
9
|
1
|
51
|
Moose::Util::add_method_modifier(shift, 'around', \@_); |
87
|
|
|
|
|
|
|
} |
88
|
|
|
|
|
|
|
|
89
|
|
|
|
|
|
|
our $SUPER_PACKAGE; |
90
|
|
|
|
|
|
|
our $SUPER_BODY; |
91
|
|
|
|
|
|
|
our @SUPER_ARGS; |
92
|
|
|
|
|
|
|
|
93
|
|
|
|
|
|
|
sub super { |
94
|
19
|
100
|
|
19
|
1
|
112
|
if (@_) { |
95
|
1
|
|
|
|
|
231
|
carp 'Arguments passed to super() are ignored'; |
96
|
|
|
|
|
|
|
} |
97
|
|
|
|
|
|
|
|
98
|
|
|
|
|
|
|
# This check avoids a recursion loop - see |
99
|
|
|
|
|
|
|
# t/bugs/super_recursion.t |
100
|
19
|
100
|
100
|
|
|
94
|
return if defined $SUPER_PACKAGE && $SUPER_PACKAGE ne caller(); |
101
|
18
|
100
|
|
|
|
43
|
return unless $SUPER_BODY; $SUPER_BODY->(@SUPER_ARGS); |
|
17
|
|
|
|
|
48
|
|
102
|
|
|
|
|
|
|
} |
103
|
|
|
|
|
|
|
|
104
|
|
|
|
|
|
|
sub override { |
105
|
20
|
|
|
20
|
1
|
42
|
my $meta = shift; |
106
|
20
|
|
|
|
|
54
|
my ( $name, $method ) = @_; |
107
|
20
|
|
|
|
|
81
|
$meta->add_override_method_modifier( $name => $method ); |
108
|
|
|
|
|
|
|
} |
109
|
|
|
|
|
|
|
|
110
|
|
|
|
|
|
|
sub inner { |
111
|
27
|
|
|
27
|
1
|
2689
|
my $pkg = caller(); |
112
|
27
|
|
|
|
|
32
|
our ( %INNER_BODY, %INNER_ARGS ); |
113
|
|
|
|
|
|
|
|
114
|
27
|
100
|
|
|
|
84
|
if ( my $body = $INNER_BODY{$pkg} ) { |
115
|
19
|
|
|
|
|
24
|
my @args = @{ $INNER_ARGS{$pkg} }; |
|
19
|
|
|
|
|
38
|
|
116
|
19
|
|
|
|
|
36
|
local $INNER_ARGS{$pkg}; |
117
|
19
|
|
|
|
|
31
|
local $INNER_BODY{$pkg}; |
118
|
19
|
|
|
|
|
41
|
return $body->(@args); |
119
|
|
|
|
|
|
|
} else { |
120
|
8
|
|
|
|
|
21
|
return; |
121
|
|
|
|
|
|
|
} |
122
|
|
|
|
|
|
|
} |
123
|
|
|
|
|
|
|
|
124
|
|
|
|
|
|
|
sub augment { |
125
|
16
|
|
|
16
|
1
|
30
|
my $meta = shift; |
126
|
16
|
|
|
|
|
39
|
my ( $name, $method ) = @_; |
127
|
16
|
|
|
|
|
58
|
$meta->add_augment_method_modifier( $name => $method ); |
128
|
|
|
|
|
|
|
} |
129
|
|
|
|
|
|
|
|
130
|
|
|
|
|
|
|
Moose::Exporter->setup_import_methods( |
131
|
|
|
|
|
|
|
with_meta => [ |
132
|
|
|
|
|
|
|
qw( extends with has before after around override augment ) |
133
|
|
|
|
|
|
|
], |
134
|
|
|
|
|
|
|
as_is => [ |
135
|
|
|
|
|
|
|
qw( super inner ), |
136
|
|
|
|
|
|
|
'Carp::confess', |
137
|
|
|
|
|
|
|
'Scalar::Util::blessed', |
138
|
|
|
|
|
|
|
], |
139
|
|
|
|
|
|
|
); |
140
|
|
|
|
|
|
|
|
141
|
|
|
|
|
|
|
sub init_meta { |
142
|
1565
|
|
|
1565
|
0
|
3838
|
shift; |
143
|
1565
|
|
|
|
|
6328
|
my %args = @_; |
144
|
|
|
|
|
|
|
|
145
|
|
|
|
|
|
|
my $class = $args{for_class} |
146
|
1565
|
100
|
|
|
|
5330
|
or throw_exception( InitMetaRequiresClass => params => \%args ); |
147
|
|
|
|
|
|
|
|
148
|
1564
|
|
100
|
|
|
6890
|
my $base_class = $args{base_class} || 'Moose::Object'; |
149
|
1564
|
|
100
|
|
|
5611
|
my $metaclass = $args{metaclass} || 'Moose::Meta::Class'; |
150
|
1564
|
100
|
|
|
|
4115
|
my $meta_name = exists $args{meta_name} ? $args{meta_name} : 'meta'; |
151
|
|
|
|
|
|
|
|
152
|
1564
|
100
|
|
|
|
9350
|
throw_exception( MetaclassNotLoaded => class_name => $metaclass ) |
153
|
|
|
|
|
|
|
unless is_class_loaded($metaclass); |
154
|
|
|
|
|
|
|
|
155
|
1562
|
100
|
|
|
|
8099
|
throw_exception( MetaclassMustBeASubclassOfMooseMetaClass => class_name => $metaclass ) |
156
|
|
|
|
|
|
|
unless $metaclass->isa('Moose::Meta::Class'); |
157
|
|
|
|
|
|
|
|
158
|
|
|
|
|
|
|
# make a subtype for each Moose class |
159
|
1561
|
100
|
|
|
|
5953
|
class_type($class) |
160
|
|
|
|
|
|
|
unless find_type_constraint($class); |
161
|
|
|
|
|
|
|
|
162
|
1561
|
|
|
|
|
3084
|
my $meta; |
163
|
|
|
|
|
|
|
|
164
|
1561
|
100
|
|
|
|
5228
|
if ( $meta = Class::MOP::get_metaclass_by_name($class) ) { |
165
|
70
|
100
|
|
|
|
316
|
unless ( $meta->isa("Moose::Meta::Class") ) { |
166
|
3
|
100
|
|
|
|
14
|
if ( $meta->isa('Moose::Meta::Role') ) { |
167
|
1
|
|
|
|
|
6
|
throw_exception( MetaclassIsARoleNotASubclassOfGivenMetaclass => role_name => $class, |
168
|
|
|
|
|
|
|
metaclass => $metaclass, |
169
|
|
|
|
|
|
|
role => $meta |
170
|
|
|
|
|
|
|
); |
171
|
|
|
|
|
|
|
} else { |
172
|
2
|
|
|
|
|
10
|
throw_exception( MetaclassIsNotASubclassOfGivenMetaclass => class_name => $class, |
173
|
|
|
|
|
|
|
metaclass => $metaclass, |
174
|
|
|
|
|
|
|
class => $meta |
175
|
|
|
|
|
|
|
); |
176
|
|
|
|
|
|
|
} |
177
|
|
|
|
|
|
|
} |
178
|
|
|
|
|
|
|
} else { |
179
|
|
|
|
|
|
|
# no metaclass |
180
|
|
|
|
|
|
|
|
181
|
|
|
|
|
|
|
# now we check whether our ancestors have metaclass, and if so borrow that |
182
|
1491
|
|
|
|
|
2800
|
my ( undef, @isa ) = @{ mro::get_linear_isa($class) }; |
|
1491
|
|
|
|
|
9955
|
|
183
|
|
|
|
|
|
|
|
184
|
1491
|
|
|
|
|
4139
|
foreach my $ancestor ( @isa ) { |
185
|
9
|
|
100
|
|
|
24
|
my $ancestor_meta = Class::MOP::get_metaclass_by_name($ancestor) || next; |
186
|
|
|
|
|
|
|
|
187
|
5
|
|
|
|
|
22
|
my $ancestor_meta_class = $ancestor_meta->_real_ref_name; |
188
|
|
|
|
|
|
|
|
189
|
|
|
|
|
|
|
# if we have an ancestor metaclass that inherits $metaclass, we use |
190
|
|
|
|
|
|
|
# that. This is like _fix_metaclass_incompatibility, but we can do it now. |
191
|
|
|
|
|
|
|
|
192
|
|
|
|
|
|
|
# the case of having an ancestry is not very common, but arises in |
193
|
|
|
|
|
|
|
# e.g. Reaction |
194
|
5
|
100
|
|
|
|
27
|
unless ( $metaclass->isa( $ancestor_meta_class ) ) { |
195
|
1
|
50
|
|
|
|
7
|
if ( $ancestor_meta_class->isa($metaclass) ) { |
196
|
1
|
|
|
|
|
2
|
$metaclass = $ancestor_meta_class; |
197
|
|
|
|
|
|
|
} |
198
|
|
|
|
|
|
|
} |
199
|
|
|
|
|
|
|
} |
200
|
|
|
|
|
|
|
|
201
|
1491
|
|
|
|
|
6616
|
$meta = $metaclass->initialize($class); |
202
|
1491
|
|
|
|
|
6881
|
my $filename = module_notional_filename($meta->name); |
203
|
|
|
|
|
|
|
$INC{$filename} = '(set by Moose)' |
204
|
1491
|
100
|
|
|
|
35503
|
unless exists $INC{$filename}; |
205
|
|
|
|
|
|
|
} |
206
|
|
|
|
|
|
|
|
207
|
1558
|
100
|
|
|
|
4638
|
if (defined $meta_name) { |
208
|
|
|
|
|
|
|
# also check for inherited non moose 'meta' method? |
209
|
1557
|
|
|
|
|
5981
|
my $existing = $meta->get_method($meta_name); |
210
|
1557
|
50
|
66
|
|
|
5632
|
if ($existing && !$existing->isa('Class::MOP::Method::Meta')) { |
211
|
0
|
|
|
|
|
0
|
Carp::cluck "Moose is overwriting an existing method named " |
212
|
|
|
|
|
|
|
. "$meta_name in class $class with a method " |
213
|
|
|
|
|
|
|
. "which returns the class's metaclass. If this is " |
214
|
|
|
|
|
|
|
. "actually what you want, you should remove the " |
215
|
|
|
|
|
|
|
. "existing method, otherwise, you should rename or " |
216
|
|
|
|
|
|
|
. "disable this generated method using the " |
217
|
|
|
|
|
|
|
. "'-meta_name' option to 'use Moose'."; |
218
|
|
|
|
|
|
|
} |
219
|
1557
|
|
|
|
|
5540
|
$meta->_add_meta_method($meta_name); |
220
|
|
|
|
|
|
|
} |
221
|
|
|
|
|
|
|
|
222
|
|
|
|
|
|
|
# make sure they inherit from Moose::Object |
223
|
1558
|
100
|
|
|
|
5798
|
$meta->superclasses($base_class) |
224
|
|
|
|
|
|
|
unless $meta->superclasses(); |
225
|
|
|
|
|
|
|
|
226
|
1558
|
|
|
|
|
6183
|
return $meta; |
227
|
|
|
|
|
|
|
} |
228
|
|
|
|
|
|
|
|
229
|
|
|
|
|
|
|
# This may be used in some older MooseX extensions. |
230
|
|
|
|
|
|
|
sub _get_caller { |
231
|
0
|
|
|
0
|
|
|
goto &Moose::Exporter::_get_caller; |
232
|
|
|
|
|
|
|
} |
233
|
|
|
|
|
|
|
|
234
|
|
|
|
|
|
|
## make 'em all immutable |
235
|
|
|
|
|
|
|
|
236
|
|
|
|
|
|
|
$_->make_immutable( |
237
|
|
|
|
|
|
|
inline_constructor => 1, |
238
|
|
|
|
|
|
|
constructor_name => "_new", |
239
|
|
|
|
|
|
|
# these are Class::MOP accessors, so they need inlining |
240
|
|
|
|
|
|
|
inline_accessors => 1 |
241
|
|
|
|
|
|
|
) for grep { $_->is_mutable } |
242
|
|
|
|
|
|
|
map { $_->meta } |
243
|
|
|
|
|
|
|
qw( |
244
|
|
|
|
|
|
|
Moose::Meta::Attribute |
245
|
|
|
|
|
|
|
Moose::Meta::Class |
246
|
|
|
|
|
|
|
Moose::Meta::Instance |
247
|
|
|
|
|
|
|
|
248
|
|
|
|
|
|
|
Moose::Meta::TypeCoercion |
249
|
|
|
|
|
|
|
Moose::Meta::TypeCoercion::Union |
250
|
|
|
|
|
|
|
|
251
|
|
|
|
|
|
|
Moose::Meta::Method |
252
|
|
|
|
|
|
|
Moose::Meta::Method::Constructor |
253
|
|
|
|
|
|
|
Moose::Meta::Method::Destructor |
254
|
|
|
|
|
|
|
Moose::Meta::Method::Overridden |
255
|
|
|
|
|
|
|
Moose::Meta::Method::Augmented |
256
|
|
|
|
|
|
|
|
257
|
|
|
|
|
|
|
Moose::Meta::Role |
258
|
|
|
|
|
|
|
Moose::Meta::Role::Attribute |
259
|
|
|
|
|
|
|
Moose::Meta::Role::Method |
260
|
|
|
|
|
|
|
Moose::Meta::Role::Method::Required |
261
|
|
|
|
|
|
|
Moose::Meta::Role::Method::Conflicting |
262
|
|
|
|
|
|
|
|
263
|
|
|
|
|
|
|
Moose::Meta::Role::Composite |
264
|
|
|
|
|
|
|
|
265
|
|
|
|
|
|
|
Moose::Meta::Role::Application |
266
|
|
|
|
|
|
|
Moose::Meta::Role::Application::RoleSummation |
267
|
|
|
|
|
|
|
Moose::Meta::Role::Application::ToClass |
268
|
|
|
|
|
|
|
Moose::Meta::Role::Application::ToRole |
269
|
|
|
|
|
|
|
Moose::Meta::Role::Application::ToInstance |
270
|
|
|
|
|
|
|
); |
271
|
|
|
|
|
|
|
|
272
|
|
|
|
|
|
|
$_->make_immutable( |
273
|
|
|
|
|
|
|
inline_constructor => 0, |
274
|
|
|
|
|
|
|
constructor_name => undef, |
275
|
|
|
|
|
|
|
# these are Class::MOP accessors, so they need inlining |
276
|
|
|
|
|
|
|
inline_accessors => 1 |
277
|
|
|
|
|
|
|
) for grep { $_->is_mutable } |
278
|
|
|
|
|
|
|
map { $_->meta } |
279
|
|
|
|
|
|
|
qw( |
280
|
|
|
|
|
|
|
Moose::Meta::Method::Accessor |
281
|
|
|
|
|
|
|
Moose::Meta::Method::Delegation |
282
|
|
|
|
|
|
|
Moose::Meta::Mixin::AttributeCore |
283
|
|
|
|
|
|
|
); |
284
|
|
|
|
|
|
|
|
285
|
|
|
|
|
|
|
1; |
286
|
|
|
|
|
|
|
|
287
|
|
|
|
|
|
|
# ABSTRACT: A postmodern object system for Perl 5 |
288
|
|
|
|
|
|
|
|
289
|
|
|
|
|
|
|
__END__ |
290
|
|
|
|
|
|
|
|
291
|
|
|
|
|
|
|
=pod |
292
|
|
|
|
|
|
|
|
293
|
|
|
|
|
|
|
=encoding UTF-8 |
294
|
|
|
|
|
|
|
|
295
|
|
|
|
|
|
|
=head1 NAME |
296
|
|
|
|
|
|
|
|
297
|
|
|
|
|
|
|
Moose - A postmodern object system for Perl 5 |
298
|
|
|
|
|
|
|
|
299
|
|
|
|
|
|
|
=head1 VERSION |
300
|
|
|
|
|
|
|
|
301
|
|
|
|
|
|
|
version 2.2203 |
302
|
|
|
|
|
|
|
|
303
|
|
|
|
|
|
|
=head1 SYNOPSIS |
304
|
|
|
|
|
|
|
|
305
|
|
|
|
|
|
|
package Point; |
306
|
|
|
|
|
|
|
use Moose; # automatically turns on strict and warnings |
307
|
|
|
|
|
|
|
|
308
|
|
|
|
|
|
|
has 'x' => (is => 'rw', isa => 'Int'); |
309
|
|
|
|
|
|
|
has 'y' => (is => 'rw', isa => 'Int'); |
310
|
|
|
|
|
|
|
|
311
|
|
|
|
|
|
|
sub clear { |
312
|
|
|
|
|
|
|
my $self = shift; |
313
|
|
|
|
|
|
|
$self->x(0); |
314
|
|
|
|
|
|
|
$self->y(0); |
315
|
|
|
|
|
|
|
} |
316
|
|
|
|
|
|
|
|
317
|
|
|
|
|
|
|
package Point3D; |
318
|
|
|
|
|
|
|
use Moose; |
319
|
|
|
|
|
|
|
|
320
|
|
|
|
|
|
|
extends 'Point'; |
321
|
|
|
|
|
|
|
|
322
|
|
|
|
|
|
|
has 'z' => (is => 'rw', isa => 'Int'); |
323
|
|
|
|
|
|
|
|
324
|
|
|
|
|
|
|
after 'clear' => sub { |
325
|
|
|
|
|
|
|
my $self = shift; |
326
|
|
|
|
|
|
|
$self->z(0); |
327
|
|
|
|
|
|
|
}; |
328
|
|
|
|
|
|
|
|
329
|
|
|
|
|
|
|
=head1 DESCRIPTION |
330
|
|
|
|
|
|
|
|
331
|
|
|
|
|
|
|
Moose is an extension of the Perl 5 object system. |
332
|
|
|
|
|
|
|
|
333
|
|
|
|
|
|
|
The main goal of Moose is to make Perl 5 Object Oriented programming |
334
|
|
|
|
|
|
|
easier, more consistent, and less tedious. With Moose you can think |
335
|
|
|
|
|
|
|
more about what you want to do and less about the mechanics of OOP. |
336
|
|
|
|
|
|
|
|
337
|
|
|
|
|
|
|
Additionally, Moose is built on top of L<Class::MOP>, which is a |
338
|
|
|
|
|
|
|
metaclass system for Perl 5. This means that Moose not only makes |
339
|
|
|
|
|
|
|
building normal Perl 5 objects better, but it provides the power of |
340
|
|
|
|
|
|
|
metaclass programming as well. |
341
|
|
|
|
|
|
|
|
342
|
|
|
|
|
|
|
=head2 New to Moose? |
343
|
|
|
|
|
|
|
|
344
|
|
|
|
|
|
|
If you're new to Moose, the best place to start is the |
345
|
|
|
|
|
|
|
L<Moose::Manual> docs, followed by the L<Moose::Cookbook>. The intro |
346
|
|
|
|
|
|
|
will show you what Moose is, and how it makes Perl 5 OO better. |
347
|
|
|
|
|
|
|
|
348
|
|
|
|
|
|
|
The cookbook recipes on Moose basics will get you up to speed with |
349
|
|
|
|
|
|
|
many of Moose's features quickly. Once you have an idea of what Moose |
350
|
|
|
|
|
|
|
can do, you can use the API documentation to get more detail on |
351
|
|
|
|
|
|
|
features which interest you. |
352
|
|
|
|
|
|
|
|
353
|
|
|
|
|
|
|
=head2 Moose Extensions |
354
|
|
|
|
|
|
|
|
355
|
|
|
|
|
|
|
The C<MooseX::> namespace is the official place to find Moose extensions. |
356
|
|
|
|
|
|
|
These extensions can be found on the CPAN. The easiest way to find them |
357
|
|
|
|
|
|
|
is to search for them (L<https://metacpan.org/search?q=MooseX::>), |
358
|
|
|
|
|
|
|
or to examine L<Task::Moose> which aims to keep an up-to-date, easily |
359
|
|
|
|
|
|
|
installable list of Moose extensions. |
360
|
|
|
|
|
|
|
|
361
|
|
|
|
|
|
|
=head1 TRANSLATIONS |
362
|
|
|
|
|
|
|
|
363
|
|
|
|
|
|
|
Much of the Moose documentation has been translated into other languages. |
364
|
|
|
|
|
|
|
|
365
|
|
|
|
|
|
|
=over 4 |
366
|
|
|
|
|
|
|
|
367
|
|
|
|
|
|
|
=item Japanese |
368
|
|
|
|
|
|
|
|
369
|
|
|
|
|
|
|
Japanese docs can be found at |
370
|
|
|
|
|
|
|
L<http://perldoc.perlassociation.org/pod/Moose-Doc-JA/index.html>. The |
371
|
|
|
|
|
|
|
source POD files can be found in GitHub: |
372
|
|
|
|
|
|
|
L<http://github.com/jpa/Moose-Doc-JA> |
373
|
|
|
|
|
|
|
|
374
|
|
|
|
|
|
|
=back |
375
|
|
|
|
|
|
|
|
376
|
|
|
|
|
|
|
=head1 BUILDING CLASSES WITH MOOSE |
377
|
|
|
|
|
|
|
|
378
|
|
|
|
|
|
|
Moose makes every attempt to provide as much convenience as possible during |
379
|
|
|
|
|
|
|
class construction/definition, but still stay out of your way if you want it |
380
|
|
|
|
|
|
|
to. Here are a few items to note when building classes with Moose. |
381
|
|
|
|
|
|
|
|
382
|
|
|
|
|
|
|
When you C<use Moose>, Moose will set the class's parent class to |
383
|
|
|
|
|
|
|
L<Moose::Object>, I<unless> the class using Moose already has a parent |
384
|
|
|
|
|
|
|
class. In addition, specifying a parent with C<extends> will change the parent |
385
|
|
|
|
|
|
|
class. |
386
|
|
|
|
|
|
|
|
387
|
|
|
|
|
|
|
Moose will also manage all attributes (including inherited ones) that are |
388
|
|
|
|
|
|
|
defined with C<has>. And (assuming you call C<new>, which is inherited from |
389
|
|
|
|
|
|
|
L<Moose::Object>) this includes properly initializing all instance slots, |
390
|
|
|
|
|
|
|
setting defaults where appropriate, and performing any type constraint checking |
391
|
|
|
|
|
|
|
or coercion. |
392
|
|
|
|
|
|
|
|
393
|
|
|
|
|
|
|
=head1 PROVIDED METHODS |
394
|
|
|
|
|
|
|
|
395
|
|
|
|
|
|
|
Moose provides a number of methods to all your classes, mostly through the |
396
|
|
|
|
|
|
|
inheritance of L<Moose::Object>. There is however, one exception. By default, |
397
|
|
|
|
|
|
|
Moose will install a method named C<meta> in any class which uses |
398
|
|
|
|
|
|
|
C<Moose>. This method returns the current class's metaclass. |
399
|
|
|
|
|
|
|
|
400
|
|
|
|
|
|
|
If you'd like to rename this method, you can do so by passing the |
401
|
|
|
|
|
|
|
C<-meta_name> option when using Moose: |
402
|
|
|
|
|
|
|
|
403
|
|
|
|
|
|
|
use Moose -meta_name => 'my_meta'; |
404
|
|
|
|
|
|
|
|
405
|
|
|
|
|
|
|
However, the L<Moose::Object> class I<also> provides a method named C<meta> |
406
|
|
|
|
|
|
|
which does the same thing. If your class inherits from L<Moose::Object> (which |
407
|
|
|
|
|
|
|
is the default), then you will still have a C<meta> method. However, if your |
408
|
|
|
|
|
|
|
class inherits from a parent which provides a C<meta> method of its own, your |
409
|
|
|
|
|
|
|
class will inherit that instead. |
410
|
|
|
|
|
|
|
|
411
|
|
|
|
|
|
|
If you'd like for Moose to not install a meta method at all, you can pass |
412
|
|
|
|
|
|
|
C<undef> as the C<-meta_name> option: |
413
|
|
|
|
|
|
|
|
414
|
|
|
|
|
|
|
use Moose -meta_name => undef; |
415
|
|
|
|
|
|
|
|
416
|
|
|
|
|
|
|
Again, you will still inherit C<meta> from L<Moose::Object> in this case. |
417
|
|
|
|
|
|
|
|
418
|
|
|
|
|
|
|
=head1 EXPORTED FUNCTIONS |
419
|
|
|
|
|
|
|
|
420
|
|
|
|
|
|
|
Moose will export a number of functions into the class's namespace which |
421
|
|
|
|
|
|
|
may then be used to set up the class. These functions all work directly |
422
|
|
|
|
|
|
|
on the current class. |
423
|
|
|
|
|
|
|
|
424
|
|
|
|
|
|
|
=head2 extends (@superclasses) |
425
|
|
|
|
|
|
|
|
426
|
|
|
|
|
|
|
This function will set the superclass(es) for the current class. If the parent |
427
|
|
|
|
|
|
|
classes are not yet loaded, then C<extends> tries to load them. |
428
|
|
|
|
|
|
|
|
429
|
|
|
|
|
|
|
This approach is recommended instead of C<use L<base>>/C<use L<parent>>, because |
430
|
|
|
|
|
|
|
C<use base> actually C<push>es onto the class's C<@ISA>, whereas C<extends> will |
431
|
|
|
|
|
|
|
replace it. This is important to ensure that classes which do not have |
432
|
|
|
|
|
|
|
superclasses still properly inherit from L<Moose::Object>. |
433
|
|
|
|
|
|
|
|
434
|
|
|
|
|
|
|
Each superclass can be followed by a hash reference with options. Currently, |
435
|
|
|
|
|
|
|
only L<-version|Class::MOP/Class Loading Options> is recognized: |
436
|
|
|
|
|
|
|
|
437
|
|
|
|
|
|
|
extends 'My::Parent' => { -version => 0.01 }, |
438
|
|
|
|
|
|
|
'My::OtherParent' => { -version => 0.03 }; |
439
|
|
|
|
|
|
|
|
440
|
|
|
|
|
|
|
An exception will be thrown if the version requirements are not |
441
|
|
|
|
|
|
|
satisfied. |
442
|
|
|
|
|
|
|
|
443
|
|
|
|
|
|
|
=head2 with (@roles) |
444
|
|
|
|
|
|
|
|
445
|
|
|
|
|
|
|
This will apply a given set of C<@roles> to the local class. |
446
|
|
|
|
|
|
|
|
447
|
|
|
|
|
|
|
Like with C<extends>, each specified role can be followed by a hash |
448
|
|
|
|
|
|
|
reference with a L<-version|Class::MOP/Class Loading Options> option: |
449
|
|
|
|
|
|
|
|
450
|
|
|
|
|
|
|
with 'My::Role' => { -version => 0.32 }, |
451
|
|
|
|
|
|
|
'My::Otherrole' => { -version => 0.23 }; |
452
|
|
|
|
|
|
|
|
453
|
|
|
|
|
|
|
The specified version requirements must be satisfied, otherwise an |
454
|
|
|
|
|
|
|
exception will be thrown. |
455
|
|
|
|
|
|
|
|
456
|
|
|
|
|
|
|
If your role takes options or arguments, they can be passed along in the |
457
|
|
|
|
|
|
|
hash reference as well. |
458
|
|
|
|
|
|
|
|
459
|
|
|
|
|
|
|
You should only use one C<with>, even if you are consuming multiple roles. If |
460
|
|
|
|
|
|
|
you consume roles using multiple C<with> statements Moose cannot detect method |
461
|
|
|
|
|
|
|
conflicts between those roles. |
462
|
|
|
|
|
|
|
|
463
|
|
|
|
|
|
|
=head2 has $name|@$names =E<gt> %options |
464
|
|
|
|
|
|
|
|
465
|
|
|
|
|
|
|
This will install an attribute of a given C<$name> into the current class. If |
466
|
|
|
|
|
|
|
the first parameter is an array reference, it will create an attribute for |
467
|
|
|
|
|
|
|
every C<$name> in the list. The C<%options> will be passed to the constructor |
468
|
|
|
|
|
|
|
for L<Moose::Meta::Attribute> (which inherits from L<Class::MOP::Attribute>), |
469
|
|
|
|
|
|
|
so the full documentation for the valid options can be found there. These are |
470
|
|
|
|
|
|
|
the most commonly used options: |
471
|
|
|
|
|
|
|
|
472
|
|
|
|
|
|
|
=over 4 |
473
|
|
|
|
|
|
|
|
474
|
|
|
|
|
|
|
=item I<is =E<gt> 'rw'|'ro'> |
475
|
|
|
|
|
|
|
|
476
|
|
|
|
|
|
|
The I<is> option accepts either I<rw> (for read/write) or I<ro> (for read |
477
|
|
|
|
|
|
|
only). These will create either a read/write accessor or a read-only |
478
|
|
|
|
|
|
|
accessor respectively, using the same name as the C<$name> of the attribute. |
479
|
|
|
|
|
|
|
|
480
|
|
|
|
|
|
|
If you need more control over how your accessors are named, you can |
481
|
|
|
|
|
|
|
use the L<reader|Class::MOP::Attribute/reader>, |
482
|
|
|
|
|
|
|
L<writer|Class::MOP::Attribute/writer> and |
483
|
|
|
|
|
|
|
L<accessor|Class::MOP::Attribute/accessor> options inherited from |
484
|
|
|
|
|
|
|
L<Class::MOP::Attribute>, however if you use those, you won't need the |
485
|
|
|
|
|
|
|
I<is> option. |
486
|
|
|
|
|
|
|
|
487
|
|
|
|
|
|
|
=item I<isa =E<gt> $type_name> |
488
|
|
|
|
|
|
|
|
489
|
|
|
|
|
|
|
The I<isa> option uses Moose's type constraint facilities to set up runtime |
490
|
|
|
|
|
|
|
type checking for this attribute. Moose will perform the checks during class |
491
|
|
|
|
|
|
|
construction, and within any accessors. The C<$type_name> argument must be a |
492
|
|
|
|
|
|
|
string. The string may be either a class name or a type defined using |
493
|
|
|
|
|
|
|
Moose's type definition features. (Refer to L<Moose::Util::TypeConstraints> |
494
|
|
|
|
|
|
|
for information on how to define a new type, and how to retrieve type meta-data). |
495
|
|
|
|
|
|
|
|
496
|
|
|
|
|
|
|
=item I<coerce =E<gt> (1|0)> |
497
|
|
|
|
|
|
|
|
498
|
|
|
|
|
|
|
This will attempt to use coercion with the supplied type constraint to change |
499
|
|
|
|
|
|
|
the value passed into any accessors or constructors. You B<must> supply a type |
500
|
|
|
|
|
|
|
constraint, and that type constraint B<must> define a coercion. See |
501
|
|
|
|
|
|
|
L<Moose::Cookbook::Basics::HTTP_SubtypesAndCoercion> for an example. |
502
|
|
|
|
|
|
|
|
503
|
|
|
|
|
|
|
=item I<does =E<gt> $role_name> |
504
|
|
|
|
|
|
|
|
505
|
|
|
|
|
|
|
This will accept the name of a role which the value stored in this attribute |
506
|
|
|
|
|
|
|
is expected to have consumed. |
507
|
|
|
|
|
|
|
|
508
|
|
|
|
|
|
|
=item I<required =E<gt> (1|0)> |
509
|
|
|
|
|
|
|
|
510
|
|
|
|
|
|
|
This marks the attribute as being required. This means a value must be |
511
|
|
|
|
|
|
|
supplied during class construction, I<or> the attribute must be lazy |
512
|
|
|
|
|
|
|
and have either a default or a builder. Note that C<required> does not |
513
|
|
|
|
|
|
|
say anything about the attribute's value, which can be C<undef>. |
514
|
|
|
|
|
|
|
|
515
|
|
|
|
|
|
|
=item I<weak_ref =E<gt> (1|0)> |
516
|
|
|
|
|
|
|
|
517
|
|
|
|
|
|
|
This will tell the class to store the value of this attribute as a weakened |
518
|
|
|
|
|
|
|
reference. If an attribute is a weakened reference, it B<cannot> also be |
519
|
|
|
|
|
|
|
coerced. Note that when a weak ref expires, the attribute's value becomes |
520
|
|
|
|
|
|
|
undefined, and is still considered to be set for purposes of predicate, |
521
|
|
|
|
|
|
|
default, etc. |
522
|
|
|
|
|
|
|
|
523
|
|
|
|
|
|
|
=item I<lazy =E<gt> (1|0)> |
524
|
|
|
|
|
|
|
|
525
|
|
|
|
|
|
|
This will tell the class to not create this slot until absolutely necessary. |
526
|
|
|
|
|
|
|
If an attribute is marked as lazy it B<must> have a default or builder |
527
|
|
|
|
|
|
|
supplied. |
528
|
|
|
|
|
|
|
|
529
|
|
|
|
|
|
|
=item I<trigger =E<gt> $code> |
530
|
|
|
|
|
|
|
|
531
|
|
|
|
|
|
|
The I<trigger> option is a CODE reference which will be called after |
532
|
|
|
|
|
|
|
the value of the attribute is set. The CODE ref is passed the |
533
|
|
|
|
|
|
|
instance itself, the updated value, and the original value if the |
534
|
|
|
|
|
|
|
attribute was already set. |
535
|
|
|
|
|
|
|
|
536
|
|
|
|
|
|
|
You B<can> have a trigger on a read-only attribute. |
537
|
|
|
|
|
|
|
|
538
|
|
|
|
|
|
|
B<NOTE:> Triggers will only fire when you B<assign> to the attribute, |
539
|
|
|
|
|
|
|
either in the constructor, or using the writer. Default and built values will |
540
|
|
|
|
|
|
|
B<not> cause the trigger to be fired. |
541
|
|
|
|
|
|
|
|
542
|
|
|
|
|
|
|
=item I<handles =E<gt> ARRAY | HASH | REGEXP | ROLE | ROLETYPE | DUCKTYPE | CODE> |
543
|
|
|
|
|
|
|
|
544
|
|
|
|
|
|
|
The I<handles> option provides Moose classes with automated delegation features. |
545
|
|
|
|
|
|
|
This is a pretty complex and powerful option. It accepts many different option |
546
|
|
|
|
|
|
|
formats, each with its own benefits and drawbacks. |
547
|
|
|
|
|
|
|
|
548
|
|
|
|
|
|
|
B<NOTE:> The class being delegated to does not need to be a Moose based class, |
549
|
|
|
|
|
|
|
which is why this feature is especially useful when wrapping non-Moose classes. |
550
|
|
|
|
|
|
|
|
551
|
|
|
|
|
|
|
All I<handles> option formats share the following traits: |
552
|
|
|
|
|
|
|
|
553
|
|
|
|
|
|
|
You cannot override a locally defined method with a delegated method; an |
554
|
|
|
|
|
|
|
exception will be thrown if you try. That is to say, if you define C<foo> in |
555
|
|
|
|
|
|
|
your class, you cannot override it with a delegated C<foo>. This is almost never |
556
|
|
|
|
|
|
|
something you would want to do, and if it is, you should do it by hand and not |
557
|
|
|
|
|
|
|
use Moose. |
558
|
|
|
|
|
|
|
|
559
|
|
|
|
|
|
|
You cannot override any of the methods found in Moose::Object, or the C<BUILD> |
560
|
|
|
|
|
|
|
and C<DEMOLISH> methods. These will not throw an exception, but will silently |
561
|
|
|
|
|
|
|
move on to the next method in the list. My reasoning for this is that you would |
562
|
|
|
|
|
|
|
almost never want to do this, since it usually breaks your class. As with |
563
|
|
|
|
|
|
|
overriding locally defined methods, if you do want to do this, you should do it |
564
|
|
|
|
|
|
|
manually, not with Moose. |
565
|
|
|
|
|
|
|
|
566
|
|
|
|
|
|
|
You do not I<need> to have a reader (or accessor) for the attribute in order |
567
|
|
|
|
|
|
|
to delegate to it. Moose will create a means of accessing the value for you, |
568
|
|
|
|
|
|
|
however this will be several times B<less> efficient then if you had given |
569
|
|
|
|
|
|
|
the attribute a reader (or accessor) to use. |
570
|
|
|
|
|
|
|
|
571
|
|
|
|
|
|
|
Below is the documentation for each option format: |
572
|
|
|
|
|
|
|
|
573
|
|
|
|
|
|
|
=over 4 |
574
|
|
|
|
|
|
|
|
575
|
|
|
|
|
|
|
=item C<ARRAY> |
576
|
|
|
|
|
|
|
|
577
|
|
|
|
|
|
|
This is the most common usage for I<handles>. You basically pass a list of |
578
|
|
|
|
|
|
|
method names to be delegated, and Moose will install a delegation method |
579
|
|
|
|
|
|
|
for each one. |
580
|
|
|
|
|
|
|
|
581
|
|
|
|
|
|
|
=item C<HASH> |
582
|
|
|
|
|
|
|
|
583
|
|
|
|
|
|
|
This is the second most common usage for I<handles>. Instead of a list of |
584
|
|
|
|
|
|
|
method names, you pass a HASH ref where each key is the method name you |
585
|
|
|
|
|
|
|
want installed locally, and its value is the name of the original method |
586
|
|
|
|
|
|
|
in the class being delegated to. |
587
|
|
|
|
|
|
|
|
588
|
|
|
|
|
|
|
This can be very useful for recursive classes like trees. Here is a |
589
|
|
|
|
|
|
|
quick example (soon to be expanded into a Moose::Cookbook recipe): |
590
|
|
|
|
|
|
|
|
591
|
|
|
|
|
|
|
package Tree; |
592
|
|
|
|
|
|
|
use Moose; |
593
|
|
|
|
|
|
|
|
594
|
|
|
|
|
|
|
has 'node' => (is => 'rw', isa => 'Any'); |
595
|
|
|
|
|
|
|
|
596
|
|
|
|
|
|
|
has 'children' => ( |
597
|
|
|
|
|
|
|
is => 'ro', |
598
|
|
|
|
|
|
|
isa => 'ArrayRef', |
599
|
|
|
|
|
|
|
default => sub { [] } |
600
|
|
|
|
|
|
|
); |
601
|
|
|
|
|
|
|
|
602
|
|
|
|
|
|
|
has 'parent' => ( |
603
|
|
|
|
|
|
|
is => 'rw', |
604
|
|
|
|
|
|
|
isa => 'Tree', |
605
|
|
|
|
|
|
|
weak_ref => 1, |
606
|
|
|
|
|
|
|
handles => { |
607
|
|
|
|
|
|
|
parent_node => 'node', |
608
|
|
|
|
|
|
|
siblings => 'children', |
609
|
|
|
|
|
|
|
} |
610
|
|
|
|
|
|
|
); |
611
|
|
|
|
|
|
|
|
612
|
|
|
|
|
|
|
In this example, the Tree package gets C<parent_node> and C<siblings> methods, |
613
|
|
|
|
|
|
|
which delegate to the C<node> and C<children> methods (respectively) of the Tree |
614
|
|
|
|
|
|
|
instance stored in the C<parent> slot. |
615
|
|
|
|
|
|
|
|
616
|
|
|
|
|
|
|
You may also use an array reference to curry arguments to the original method. |
617
|
|
|
|
|
|
|
|
618
|
|
|
|
|
|
|
has 'thing' => ( |
619
|
|
|
|
|
|
|
... |
620
|
|
|
|
|
|
|
handles => { set_foo => [ set => 'foo' ] }, |
621
|
|
|
|
|
|
|
); |
622
|
|
|
|
|
|
|
|
623
|
|
|
|
|
|
|
# $self->set_foo(...) calls $self->thing->set('foo', ...) |
624
|
|
|
|
|
|
|
|
625
|
|
|
|
|
|
|
The first element of the array reference is the original method name, and the |
626
|
|
|
|
|
|
|
rest is a list of curried arguments. |
627
|
|
|
|
|
|
|
|
628
|
|
|
|
|
|
|
=item C<REGEXP> |
629
|
|
|
|
|
|
|
|
630
|
|
|
|
|
|
|
The regexp option works very similar to the ARRAY option, except that it builds |
631
|
|
|
|
|
|
|
the list of methods for you. It starts by collecting all possible methods of the |
632
|
|
|
|
|
|
|
class being delegated to, then filters that list using the regexp supplied here. |
633
|
|
|
|
|
|
|
|
634
|
|
|
|
|
|
|
B<NOTE:> An I<isa> option is required when using the regexp option format. This |
635
|
|
|
|
|
|
|
is so that we can determine (at compile time) the method list from the class. |
636
|
|
|
|
|
|
|
Without an I<isa> this is just not possible. |
637
|
|
|
|
|
|
|
|
638
|
|
|
|
|
|
|
=item C<ROLE> or C<ROLETYPE> |
639
|
|
|
|
|
|
|
|
640
|
|
|
|
|
|
|
With the role option, you specify the name of a role or a |
641
|
|
|
|
|
|
|
L<role type|Moose::Meta::TypeConstraint::Role> whose "interface" then becomes |
642
|
|
|
|
|
|
|
the list of methods to handle. The "interface" can be defined as; the methods |
643
|
|
|
|
|
|
|
of the role and any required methods of the role. It should be noted that this |
644
|
|
|
|
|
|
|
does B<not> include any method modifiers or generated attribute methods (which |
645
|
|
|
|
|
|
|
is consistent with role composition). |
646
|
|
|
|
|
|
|
|
647
|
|
|
|
|
|
|
=item C<DUCKTYPE> |
648
|
|
|
|
|
|
|
|
649
|
|
|
|
|
|
|
With the duck type option, you pass a duck type object whose "interface" then |
650
|
|
|
|
|
|
|
becomes the list of methods to handle. The "interface" can be defined as the |
651
|
|
|
|
|
|
|
list of methods passed to C<duck_type> to create a duck type object. For more |
652
|
|
|
|
|
|
|
information on C<duck_type> please check |
653
|
|
|
|
|
|
|
L<Moose::Util::TypeConstraints>. |
654
|
|
|
|
|
|
|
|
655
|
|
|
|
|
|
|
=item C<CODE> |
656
|
|
|
|
|
|
|
|
657
|
|
|
|
|
|
|
This is the option to use when you really want to do something funky. You should |
658
|
|
|
|
|
|
|
only use it if you really know what you are doing, as it involves manual |
659
|
|
|
|
|
|
|
metaclass twiddling. |
660
|
|
|
|
|
|
|
|
661
|
|
|
|
|
|
|
This takes a code reference, which should expect two arguments. The first is the |
662
|
|
|
|
|
|
|
attribute meta-object this I<handles> is attached to. The second is the |
663
|
|
|
|
|
|
|
metaclass of the class being delegated to. It expects you to return a hash (not |
664
|
|
|
|
|
|
|
a HASH ref) of the methods you want mapped. |
665
|
|
|
|
|
|
|
|
666
|
|
|
|
|
|
|
=back |
667
|
|
|
|
|
|
|
|
668
|
|
|
|
|
|
|
=item I<traits =E<gt> [ @role_names ]> |
669
|
|
|
|
|
|
|
|
670
|
|
|
|
|
|
|
This tells Moose to take the list of C<@role_names> and apply them to the |
671
|
|
|
|
|
|
|
attribute meta-object. Custom attribute metaclass traits are useful for |
672
|
|
|
|
|
|
|
extending the capabilities of the I<has> keyword: they are the simplest way to |
673
|
|
|
|
|
|
|
extend the MOP, but they are still a fairly advanced topic and too much to |
674
|
|
|
|
|
|
|
cover here. |
675
|
|
|
|
|
|
|
|
676
|
|
|
|
|
|
|
See L<Metaclass and Trait Name Resolution> for details on how a trait name is |
677
|
|
|
|
|
|
|
resolved to a role name. |
678
|
|
|
|
|
|
|
|
679
|
|
|
|
|
|
|
Also see L<Moose::Cookbook::Meta::Labeled_AttributeTrait> for a metaclass |
680
|
|
|
|
|
|
|
trait example. |
681
|
|
|
|
|
|
|
|
682
|
|
|
|
|
|
|
=item I<builder> => Str |
683
|
|
|
|
|
|
|
|
684
|
|
|
|
|
|
|
The value of this key is the name of the method that will be called to obtain |
685
|
|
|
|
|
|
|
the value used to initialize the attribute. See the L<builder option docs in |
686
|
|
|
|
|
|
|
Class::MOP::Attribute|Class::MOP::Attribute/builder> and/or |
687
|
|
|
|
|
|
|
L<Moose::Cookbook::Basics::BinaryTree_BuilderAndLazyBuild> for more |
688
|
|
|
|
|
|
|
information. |
689
|
|
|
|
|
|
|
|
690
|
|
|
|
|
|
|
=item I<default> => SCALAR | CODE |
691
|
|
|
|
|
|
|
|
692
|
|
|
|
|
|
|
The value of this key is the default value which will initialize the attribute. |
693
|
|
|
|
|
|
|
|
694
|
|
|
|
|
|
|
NOTE: If the value is a simple scalar (string or number), then it can |
695
|
|
|
|
|
|
|
be just passed as is. However, if you wish to initialize it with a |
696
|
|
|
|
|
|
|
HASH or ARRAY ref, then you need to wrap that inside a CODE reference. |
697
|
|
|
|
|
|
|
See the L<default option docs in |
698
|
|
|
|
|
|
|
Class::MOP::Attribute|Class::MOP::Attribute/default> for more |
699
|
|
|
|
|
|
|
information. |
700
|
|
|
|
|
|
|
|
701
|
|
|
|
|
|
|
=item I<clearer> => Str |
702
|
|
|
|
|
|
|
|
703
|
|
|
|
|
|
|
Creates a method allowing you to clear the value. See the L<clearer option |
704
|
|
|
|
|
|
|
docs in Class::MOP::Attribute|Class::MOP::Attribute/clearer> for more |
705
|
|
|
|
|
|
|
information. |
706
|
|
|
|
|
|
|
|
707
|
|
|
|
|
|
|
=item I<predicate> => Str |
708
|
|
|
|
|
|
|
|
709
|
|
|
|
|
|
|
Creates a method to perform a basic test to see if a value has been set in the |
710
|
|
|
|
|
|
|
attribute. See the L<predicate option docs in |
711
|
|
|
|
|
|
|
Class::MOP::Attribute|Class::MOP::Attribute/predicate> for more information. |
712
|
|
|
|
|
|
|
|
713
|
|
|
|
|
|
|
Note that the predicate will return true even for a C<weak_ref> attribute |
714
|
|
|
|
|
|
|
whose value has expired. |
715
|
|
|
|
|
|
|
|
716
|
|
|
|
|
|
|
=item I<documentation> => $string |
717
|
|
|
|
|
|
|
|
718
|
|
|
|
|
|
|
An arbitrary string that can be retrieved later by calling C<< |
719
|
|
|
|
|
|
|
$attr->documentation >>. |
720
|
|
|
|
|
|
|
|
721
|
|
|
|
|
|
|
=back |
722
|
|
|
|
|
|
|
|
723
|
|
|
|
|
|
|
=head2 has +$name =E<gt> %options |
724
|
|
|
|
|
|
|
|
725
|
|
|
|
|
|
|
This is variation on the normal attribute creator C<has> which allows you to |
726
|
|
|
|
|
|
|
clone and extend an attribute from a superclass or from a role. Here is an |
727
|
|
|
|
|
|
|
example of the superclass usage: |
728
|
|
|
|
|
|
|
|
729
|
|
|
|
|
|
|
package Foo; |
730
|
|
|
|
|
|
|
use Moose; |
731
|
|
|
|
|
|
|
|
732
|
|
|
|
|
|
|
has 'message' => ( |
733
|
|
|
|
|
|
|
is => 'rw', |
734
|
|
|
|
|
|
|
isa => 'Str', |
735
|
|
|
|
|
|
|
default => 'Hello, I am a Foo' |
736
|
|
|
|
|
|
|
); |
737
|
|
|
|
|
|
|
|
738
|
|
|
|
|
|
|
package My::Foo; |
739
|
|
|
|
|
|
|
use Moose; |
740
|
|
|
|
|
|
|
|
741
|
|
|
|
|
|
|
extends 'Foo'; |
742
|
|
|
|
|
|
|
|
743
|
|
|
|
|
|
|
has '+message' => (default => 'Hello I am My::Foo'); |
744
|
|
|
|
|
|
|
|
745
|
|
|
|
|
|
|
What is happening here is that B<My::Foo> is cloning the C<message> attribute |
746
|
|
|
|
|
|
|
from its parent class B<Foo>, retaining the C<is =E<gt> 'rw'> and C<isa =E<gt> |
747
|
|
|
|
|
|
|
'Str'> characteristics, but changing the value in C<default>. |
748
|
|
|
|
|
|
|
|
749
|
|
|
|
|
|
|
Here is another example, but within the context of a role: |
750
|
|
|
|
|
|
|
|
751
|
|
|
|
|
|
|
package Foo::Role; |
752
|
|
|
|
|
|
|
use Moose::Role; |
753
|
|
|
|
|
|
|
|
754
|
|
|
|
|
|
|
has 'message' => ( |
755
|
|
|
|
|
|
|
is => 'rw', |
756
|
|
|
|
|
|
|
isa => 'Str', |
757
|
|
|
|
|
|
|
default => 'Hello, I am a Foo' |
758
|
|
|
|
|
|
|
); |
759
|
|
|
|
|
|
|
|
760
|
|
|
|
|
|
|
package My::Foo; |
761
|
|
|
|
|
|
|
use Moose; |
762
|
|
|
|
|
|
|
|
763
|
|
|
|
|
|
|
with 'Foo::Role'; |
764
|
|
|
|
|
|
|
|
765
|
|
|
|
|
|
|
has '+message' => (default => 'Hello I am My::Foo'); |
766
|
|
|
|
|
|
|
|
767
|
|
|
|
|
|
|
In this case, we are basically taking the attribute which the role supplied |
768
|
|
|
|
|
|
|
and altering it within the bounds of this feature. |
769
|
|
|
|
|
|
|
|
770
|
|
|
|
|
|
|
Note that you can only extend an attribute from either a superclass or a role, |
771
|
|
|
|
|
|
|
you cannot extend an attribute in a role that composes over an attribute from |
772
|
|
|
|
|
|
|
another role. |
773
|
|
|
|
|
|
|
|
774
|
|
|
|
|
|
|
Aside from where the attributes come from (one from superclass, the other |
775
|
|
|
|
|
|
|
from a role), this feature works exactly the same. This feature is restricted |
776
|
|
|
|
|
|
|
somewhat, so as to try and force at least I<some> sanity into it. Most options work the same, but there are some exceptions: |
777
|
|
|
|
|
|
|
|
778
|
|
|
|
|
|
|
=over 4 |
779
|
|
|
|
|
|
|
|
780
|
|
|
|
|
|
|
=item I<reader> |
781
|
|
|
|
|
|
|
|
782
|
|
|
|
|
|
|
=item I<writer> |
783
|
|
|
|
|
|
|
|
784
|
|
|
|
|
|
|
=item I<accessor> |
785
|
|
|
|
|
|
|
|
786
|
|
|
|
|
|
|
=item I<clearer> |
787
|
|
|
|
|
|
|
|
788
|
|
|
|
|
|
|
=item I<predicate> |
789
|
|
|
|
|
|
|
|
790
|
|
|
|
|
|
|
These options can be added, but cannot override a superclass definition. |
791
|
|
|
|
|
|
|
|
792
|
|
|
|
|
|
|
=item I<traits> |
793
|
|
|
|
|
|
|
|
794
|
|
|
|
|
|
|
You are allowed to B<add> additional traits to the C<traits> definition. |
795
|
|
|
|
|
|
|
These traits will be composed into the attribute, but preexisting traits |
796
|
|
|
|
|
|
|
B<are not> overridden, or removed. |
797
|
|
|
|
|
|
|
|
798
|
|
|
|
|
|
|
=back |
799
|
|
|
|
|
|
|
|
800
|
|
|
|
|
|
|
=head2 before $name|@names|\@names|qr/.../ =E<gt> sub { ... } |
801
|
|
|
|
|
|
|
|
802
|
|
|
|
|
|
|
=head2 after $name|@names|\@names|qr/.../ =E<gt> sub { ... } |
803
|
|
|
|
|
|
|
|
804
|
|
|
|
|
|
|
=head2 around $name|@names|\@names|qr/.../ =E<gt> sub { ... } |
805
|
|
|
|
|
|
|
|
806
|
|
|
|
|
|
|
These three items are syntactic sugar for the before, after, and around method |
807
|
|
|
|
|
|
|
modifier features that L<Class::MOP> provides. More information on these may be |
808
|
|
|
|
|
|
|
found in L<Moose::Manual::MethodModifiers> and the |
809
|
|
|
|
|
|
|
L<Class::MOP::Class documentation|Class::MOP::Class/"Method Modifiers">. |
810
|
|
|
|
|
|
|
|
811
|
|
|
|
|
|
|
=head2 override ($name, &sub) |
812
|
|
|
|
|
|
|
|
813
|
|
|
|
|
|
|
An C<override> method is a way of explicitly saying "I am overriding this |
814
|
|
|
|
|
|
|
method from my superclass". You can call C<super> within this method, and |
815
|
|
|
|
|
|
|
it will work as expected. The same thing I<can> be accomplished with a normal |
816
|
|
|
|
|
|
|
method call and the C<SUPER::> pseudo-package; it is really your choice. |
817
|
|
|
|
|
|
|
|
818
|
|
|
|
|
|
|
=head2 super |
819
|
|
|
|
|
|
|
|
820
|
|
|
|
|
|
|
The keyword C<super> is a no-op when called outside of an C<override> method. In |
821
|
|
|
|
|
|
|
the context of an C<override> method, it will call the next most appropriate |
822
|
|
|
|
|
|
|
superclass method with the same arguments as the original method. |
823
|
|
|
|
|
|
|
|
824
|
|
|
|
|
|
|
=head2 augment ($name, &sub) |
825
|
|
|
|
|
|
|
|
826
|
|
|
|
|
|
|
An C<augment> method, is a way of explicitly saying "I am augmenting this |
827
|
|
|
|
|
|
|
method from my superclass". Once again, the details of how C<inner> and |
828
|
|
|
|
|
|
|
C<augment> work is best described in the |
829
|
|
|
|
|
|
|
L<Moose::Cookbook::Basics::Document_AugmentAndInner>. |
830
|
|
|
|
|
|
|
|
831
|
|
|
|
|
|
|
=head2 inner |
832
|
|
|
|
|
|
|
|
833
|
|
|
|
|
|
|
The keyword C<inner>, much like C<super>, is a no-op outside of the context of |
834
|
|
|
|
|
|
|
an C<augment> method. You can think of C<inner> as being the inverse of |
835
|
|
|
|
|
|
|
C<super>; the details of how C<inner> and C<augment> work is best described in |
836
|
|
|
|
|
|
|
the L<Moose::Cookbook::Basics::Document_AugmentAndInner>. |
837
|
|
|
|
|
|
|
|
838
|
|
|
|
|
|
|
=head2 blessed |
839
|
|
|
|
|
|
|
|
840
|
|
|
|
|
|
|
This is the C<Scalar::Util::blessed> function. It is highly recommended that |
841
|
|
|
|
|
|
|
this is used instead of C<ref> anywhere you need to test for an object's class |
842
|
|
|
|
|
|
|
name. |
843
|
|
|
|
|
|
|
|
844
|
|
|
|
|
|
|
=head2 confess |
845
|
|
|
|
|
|
|
|
846
|
|
|
|
|
|
|
This is the C<Carp::confess> function, and exported here for historical |
847
|
|
|
|
|
|
|
reasons. |
848
|
|
|
|
|
|
|
|
849
|
|
|
|
|
|
|
=head1 METACLASS |
850
|
|
|
|
|
|
|
|
851
|
|
|
|
|
|
|
When you use Moose, you can specify traits which will be applied to your |
852
|
|
|
|
|
|
|
metaclass: |
853
|
|
|
|
|
|
|
|
854
|
|
|
|
|
|
|
use Moose -traits => 'My::Trait'; |
855
|
|
|
|
|
|
|
|
856
|
|
|
|
|
|
|
This is very similar to the attribute traits feature. When you do |
857
|
|
|
|
|
|
|
this, your class's C<meta> object will have the specified traits |
858
|
|
|
|
|
|
|
applied to it. |
859
|
|
|
|
|
|
|
|
860
|
|
|
|
|
|
|
=head2 Metaclass and Trait Name Resolution |
861
|
|
|
|
|
|
|
|
862
|
|
|
|
|
|
|
By default, when given a trait name, Moose simply tries to load a |
863
|
|
|
|
|
|
|
class of the same name. If such a class does not exist, it then looks |
864
|
|
|
|
|
|
|
for a class matching |
865
|
|
|
|
|
|
|
B<Moose::Meta::$type::Custom::Trait::$trait_name>. The C<$type> |
866
|
|
|
|
|
|
|
variable here will be one of B<Attribute> or B<Class>, depending on |
867
|
|
|
|
|
|
|
what the trait is being applied to. |
868
|
|
|
|
|
|
|
|
869
|
|
|
|
|
|
|
If a class with this long name exists, Moose checks to see if it has |
870
|
|
|
|
|
|
|
the method C<register_implementation>. This method is expected to |
871
|
|
|
|
|
|
|
return the I<real> class name of the trait. If there is no |
872
|
|
|
|
|
|
|
C<register_implementation> method, it will fall back to using |
873
|
|
|
|
|
|
|
B<Moose::Meta::$type::Custom::Trait::$trait> as the trait name. |
874
|
|
|
|
|
|
|
|
875
|
|
|
|
|
|
|
The lookup method for metaclasses is the same, except that it looks |
876
|
|
|
|
|
|
|
for a class matching B<Moose::Meta::$type::Custom::$metaclass_name>. |
877
|
|
|
|
|
|
|
|
878
|
|
|
|
|
|
|
If all this is confusing, take a look at |
879
|
|
|
|
|
|
|
L<Moose::Cookbook::Meta::Labeled_AttributeTrait>, which demonstrates how to |
880
|
|
|
|
|
|
|
create an attribute trait. |
881
|
|
|
|
|
|
|
|
882
|
|
|
|
|
|
|
=head1 UNIMPORTING FUNCTIONS |
883
|
|
|
|
|
|
|
|
884
|
|
|
|
|
|
|
=head2 B<unimport> |
885
|
|
|
|
|
|
|
|
886
|
|
|
|
|
|
|
Moose offers a way to remove the keywords it exports, through the C<unimport> |
887
|
|
|
|
|
|
|
method. You simply have to say C<no Moose> at the bottom of your code for this |
888
|
|
|
|
|
|
|
to work. Here is an example: |
889
|
|
|
|
|
|
|
|
890
|
|
|
|
|
|
|
package Person; |
891
|
|
|
|
|
|
|
use Moose; |
892
|
|
|
|
|
|
|
|
893
|
|
|
|
|
|
|
has 'first_name' => (is => 'rw', isa => 'Str'); |
894
|
|
|
|
|
|
|
has 'last_name' => (is => 'rw', isa => 'Str'); |
895
|
|
|
|
|
|
|
|
896
|
|
|
|
|
|
|
sub full_name { |
897
|
|
|
|
|
|
|
my $self = shift; |
898
|
|
|
|
|
|
|
$self->first_name . ' ' . $self->last_name |
899
|
|
|
|
|
|
|
} |
900
|
|
|
|
|
|
|
|
901
|
|
|
|
|
|
|
no Moose; # keywords are removed from the Person package |
902
|
|
|
|
|
|
|
|
903
|
|
|
|
|
|
|
=head1 EXTENDING AND EMBEDDING MOOSE |
904
|
|
|
|
|
|
|
|
905
|
|
|
|
|
|
|
To learn more about extending Moose, we recommend checking out the |
906
|
|
|
|
|
|
|
"Extending" recipes in the L<Moose::Cookbook>, starting with |
907
|
|
|
|
|
|
|
L<Moose::Cookbook::Extending::ExtensionOverview>, which provides an overview of |
908
|
|
|
|
|
|
|
all the different ways you might extend Moose. L<Moose::Exporter> and |
909
|
|
|
|
|
|
|
L<Moose::Util::MetaRole> are the modules which provide the majority of the |
910
|
|
|
|
|
|
|
extension functionality, so reading their documentation should also be helpful. |
911
|
|
|
|
|
|
|
|
912
|
|
|
|
|
|
|
=head2 The MooseX:: namespace |
913
|
|
|
|
|
|
|
|
914
|
|
|
|
|
|
|
Generally if you're writing an extension I<for> Moose itself you'll want |
915
|
|
|
|
|
|
|
to put your extension in the C<MooseX::> namespace. This namespace is |
916
|
|
|
|
|
|
|
specifically for extensions that make Moose better or different in some |
917
|
|
|
|
|
|
|
fundamental way. It is traditionally B<not> for a package that just happens |
918
|
|
|
|
|
|
|
to use Moose. This namespace follows from the examples of the C<LWPx::> |
919
|
|
|
|
|
|
|
and C<DBIx::> namespaces that perform the same function for C<LWP> and C<DBI> |
920
|
|
|
|
|
|
|
respectively. |
921
|
|
|
|
|
|
|
|
922
|
|
|
|
|
|
|
=head1 METACLASS COMPATIBILITY AND MOOSE |
923
|
|
|
|
|
|
|
|
924
|
|
|
|
|
|
|
Metaclass compatibility is a thorny subject. You should start by |
925
|
|
|
|
|
|
|
reading the "About Metaclass compatibility" section in the |
926
|
|
|
|
|
|
|
L<Class::MOP> docs. |
927
|
|
|
|
|
|
|
|
928
|
|
|
|
|
|
|
Moose will attempt to resolve a few cases of metaclass incompatibility |
929
|
|
|
|
|
|
|
when you set the superclasses for a class, in addition to the cases that |
930
|
|
|
|
|
|
|
L<Class::MOP> handles. |
931
|
|
|
|
|
|
|
|
932
|
|
|
|
|
|
|
Moose tries to determine if the metaclasses only "differ by roles". This |
933
|
|
|
|
|
|
|
means that the parent and child's metaclass share a common ancestor in |
934
|
|
|
|
|
|
|
their respective hierarchies, and that the subclasses under the common |
935
|
|
|
|
|
|
|
ancestor are only different because of role applications. This case is |
936
|
|
|
|
|
|
|
actually fairly common when you mix and match various C<MooseX::*> |
937
|
|
|
|
|
|
|
modules, many of which apply roles to the metaclass. |
938
|
|
|
|
|
|
|
|
939
|
|
|
|
|
|
|
If the parent and child do differ by roles, Moose replaces the |
940
|
|
|
|
|
|
|
metaclass in the child with a newly created metaclass. This metaclass |
941
|
|
|
|
|
|
|
is a subclass of the parent's metaclass which does all of the roles that |
942
|
|
|
|
|
|
|
the child's metaclass did before being replaced. Effectively, this |
943
|
|
|
|
|
|
|
means the new metaclass does all of the roles done by both the |
944
|
|
|
|
|
|
|
parent's and child's original metaclasses. |
945
|
|
|
|
|
|
|
|
946
|
|
|
|
|
|
|
Ultimately, this is all transparent to you except in the case of an |
947
|
|
|
|
|
|
|
unresolvable conflict. |
948
|
|
|
|
|
|
|
|
949
|
|
|
|
|
|
|
=head1 CAVEATS |
950
|
|
|
|
|
|
|
|
951
|
|
|
|
|
|
|
It should be noted that C<super> and C<inner> B<cannot> be used in the same |
952
|
|
|
|
|
|
|
method. However, they may be combined within the same class hierarchy; see |
953
|
|
|
|
|
|
|
F<t/basics/override_augment_inner_super.t> for an example. |
954
|
|
|
|
|
|
|
|
955
|
|
|
|
|
|
|
The reason for this is that C<super> is only valid within a method |
956
|
|
|
|
|
|
|
with the C<override> modifier, and C<inner> will never be valid within an |
957
|
|
|
|
|
|
|
C<override> method. In fact, C<augment> will skip over any C<override> methods |
958
|
|
|
|
|
|
|
when searching for its appropriate C<inner>. |
959
|
|
|
|
|
|
|
|
960
|
|
|
|
|
|
|
This might seem like a restriction, but I am of the opinion that keeping these |
961
|
|
|
|
|
|
|
two features separate (yet interoperable) actually makes them easy to use, since |
962
|
|
|
|
|
|
|
their behavior is then easier to predict. Time will tell whether I am right or |
963
|
|
|
|
|
|
|
not (UPDATE: so far so good). |
964
|
|
|
|
|
|
|
|
965
|
|
|
|
|
|
|
=head1 GETTING HELP |
966
|
|
|
|
|
|
|
|
967
|
|
|
|
|
|
|
We offer both a mailing list and a very active IRC channel. |
968
|
|
|
|
|
|
|
|
969
|
|
|
|
|
|
|
The mailing list is L<mailto:moose@perl.org>. You must be subscribed to send |
970
|
|
|
|
|
|
|
a message. To subscribe, send an empty message to |
971
|
|
|
|
|
|
|
L<mailto:moose-subscribe@perl.org> |
972
|
|
|
|
|
|
|
|
973
|
|
|
|
|
|
|
You can also visit us at C<#moose> on L<irc://irc.perl.org/#moose> |
974
|
|
|
|
|
|
|
This channel is quite active, and questions at all levels (on Moose-related |
975
|
|
|
|
|
|
|
topics ;) are welcome. |
976
|
|
|
|
|
|
|
|
977
|
|
|
|
|
|
|
=head1 WHAT DOES MOOSE STAND FOR? |
978
|
|
|
|
|
|
|
|
979
|
|
|
|
|
|
|
Moose doesn't stand for one thing in particular, however, if you want, here |
980
|
|
|
|
|
|
|
are a few of our favorites. Feel free to contribute more! |
981
|
|
|
|
|
|
|
|
982
|
|
|
|
|
|
|
=over 4 |
983
|
|
|
|
|
|
|
|
984
|
|
|
|
|
|
|
=item * Make Other Object Systems Envious |
985
|
|
|
|
|
|
|
|
986
|
|
|
|
|
|
|
=item * Makes Object Orientation So Easy |
987
|
|
|
|
|
|
|
|
988
|
|
|
|
|
|
|
=item * Makes Object Orientation Spiffy- Er (sorry ingy) |
989
|
|
|
|
|
|
|
|
990
|
|
|
|
|
|
|
=item * Most Other Object Systems Emasculate |
991
|
|
|
|
|
|
|
|
992
|
|
|
|
|
|
|
=item * Moose Often Ovulate Sorta Early |
993
|
|
|
|
|
|
|
|
994
|
|
|
|
|
|
|
=item * Moose Offers Often Super Extensions |
995
|
|
|
|
|
|
|
|
996
|
|
|
|
|
|
|
=item * Meta Object Obligates Salivary Excitation |
997
|
|
|
|
|
|
|
|
998
|
|
|
|
|
|
|
=item * Meta Object Orientation Syntax Extensions |
999
|
|
|
|
|
|
|
|
1000
|
|
|
|
|
|
|
=item * Moo, Only Overengineered, Slow, and Execrable (blame rjbs!) |
1001
|
|
|
|
|
|
|
|
1002
|
|
|
|
|
|
|
=item * Massive Object-Oriented Stacktrace Emitter |
1003
|
|
|
|
|
|
|
|
1004
|
|
|
|
|
|
|
=back |
1005
|
|
|
|
|
|
|
|
1006
|
|
|
|
|
|
|
=head1 ACKNOWLEDGEMENTS |
1007
|
|
|
|
|
|
|
|
1008
|
|
|
|
|
|
|
=over 4 |
1009
|
|
|
|
|
|
|
|
1010
|
|
|
|
|
|
|
=item I blame Sam Vilain for introducing me to the insanity that is meta-models. |
1011
|
|
|
|
|
|
|
|
1012
|
|
|
|
|
|
|
=item I blame Audrey Tang for then encouraging my meta-model habit in #perl6. |
1013
|
|
|
|
|
|
|
|
1014
|
|
|
|
|
|
|
=item Without Yuval "nothingmuch" Kogman this module would not be possible, |
1015
|
|
|
|
|
|
|
and it certainly wouldn't have this name ;P |
1016
|
|
|
|
|
|
|
|
1017
|
|
|
|
|
|
|
=item The basis of the TypeContraints module was Rob Kinyon's idea |
1018
|
|
|
|
|
|
|
originally, I just ran with it. |
1019
|
|
|
|
|
|
|
|
1020
|
|
|
|
|
|
|
=item Thanks to mst & chansen and the whole #moose posse for all the |
1021
|
|
|
|
|
|
|
early ideas/feature-requests/encouragement/bug-finding. |
1022
|
|
|
|
|
|
|
|
1023
|
|
|
|
|
|
|
=item Thanks to David "Theory" Wheeler for meta-discussions and spelling fixes. |
1024
|
|
|
|
|
|
|
|
1025
|
|
|
|
|
|
|
=back |
1026
|
|
|
|
|
|
|
|
1027
|
|
|
|
|
|
|
=head1 SEE ALSO |
1028
|
|
|
|
|
|
|
|
1029
|
|
|
|
|
|
|
=over 4 |
1030
|
|
|
|
|
|
|
|
1031
|
|
|
|
|
|
|
=item L<http://moose.perl.org/> |
1032
|
|
|
|
|
|
|
|
1033
|
|
|
|
|
|
|
This is the official web home of Moose. It contains links to our public git |
1034
|
|
|
|
|
|
|
repository, as well as links to a number of talks and articles on Moose and |
1035
|
|
|
|
|
|
|
Moose related technologies. |
1036
|
|
|
|
|
|
|
|
1037
|
|
|
|
|
|
|
=item the L<Moose manual|Moose::Manual> |
1038
|
|
|
|
|
|
|
|
1039
|
|
|
|
|
|
|
This is an introduction to Moose which covers most of the basics. |
1040
|
|
|
|
|
|
|
|
1041
|
|
|
|
|
|
|
=item Modern Perl, by chromatic |
1042
|
|
|
|
|
|
|
|
1043
|
|
|
|
|
|
|
This is an introduction to modern Perl programming, which includes a section on |
1044
|
|
|
|
|
|
|
Moose. It is available in print and as a free download from |
1045
|
|
|
|
|
|
|
L<http://onyxneon.com/books/modern_perl/>. |
1046
|
|
|
|
|
|
|
|
1047
|
|
|
|
|
|
|
=item The Moose is flying, a tutorial by Randal Schwartz |
1048
|
|
|
|
|
|
|
|
1049
|
|
|
|
|
|
|
Part 1 - L<http://www.stonehenge.com/merlyn/LinuxMag/col94.html> |
1050
|
|
|
|
|
|
|
|
1051
|
|
|
|
|
|
|
Part 2 - L<http://www.stonehenge.com/merlyn/LinuxMag/col95.html> |
1052
|
|
|
|
|
|
|
|
1053
|
|
|
|
|
|
|
=item Several Moose extension modules in the C<MooseX::> namespace. |
1054
|
|
|
|
|
|
|
|
1055
|
|
|
|
|
|
|
See L<https://metacpan.org/search?q=MooseX::> for extensions. |
1056
|
|
|
|
|
|
|
|
1057
|
|
|
|
|
|
|
=back |
1058
|
|
|
|
|
|
|
|
1059
|
|
|
|
|
|
|
=head2 Books |
1060
|
|
|
|
|
|
|
|
1061
|
|
|
|
|
|
|
=over 4 |
1062
|
|
|
|
|
|
|
|
1063
|
|
|
|
|
|
|
=item The Art of the MetaObject Protocol |
1064
|
|
|
|
|
|
|
|
1065
|
|
|
|
|
|
|
I mention this in the L<Class::MOP> docs too, as this book was critical in |
1066
|
|
|
|
|
|
|
the development of both modules and is highly recommended. |
1067
|
|
|
|
|
|
|
|
1068
|
|
|
|
|
|
|
=back |
1069
|
|
|
|
|
|
|
|
1070
|
|
|
|
|
|
|
=head2 Papers |
1071
|
|
|
|
|
|
|
|
1072
|
|
|
|
|
|
|
=over 4 |
1073
|
|
|
|
|
|
|
|
1074
|
|
|
|
|
|
|
=item L<http://www.cs.utah.edu/plt/publications/oopsla04-gff.pdf> |
1075
|
|
|
|
|
|
|
|
1076
|
|
|
|
|
|
|
This paper (suggested by lbr on #moose) was what lead to the implementation |
1077
|
|
|
|
|
|
|
of the C<super>/C<override> and C<inner>/C<augment> features. If you really |
1078
|
|
|
|
|
|
|
want to understand them, I suggest you read this. |
1079
|
|
|
|
|
|
|
|
1080
|
|
|
|
|
|
|
=back |
1081
|
|
|
|
|
|
|
|
1082
|
|
|
|
|
|
|
=head1 BUGS |
1083
|
|
|
|
|
|
|
|
1084
|
|
|
|
|
|
|
All complex software has bugs lurking in it, and this module is no |
1085
|
|
|
|
|
|
|
exception. |
1086
|
|
|
|
|
|
|
|
1087
|
|
|
|
|
|
|
Please report any bugs to C<bug-moose@rt.cpan.org>, or through the web |
1088
|
|
|
|
|
|
|
interface at L<http://rt.cpan.org>. You can also submit a C<TODO> test as a |
1089
|
|
|
|
|
|
|
pull request at L<https://github.com/moose/Moose>. |
1090
|
|
|
|
|
|
|
|
1091
|
|
|
|
|
|
|
You can also discuss feature requests or possible bugs on the Moose mailing |
1092
|
|
|
|
|
|
|
list (moose@perl.org) or on IRC at L<irc://irc.perl.org/#moose>. |
1093
|
|
|
|
|
|
|
|
1094
|
|
|
|
|
|
|
=head1 FEATURE REQUESTS |
1095
|
|
|
|
|
|
|
|
1096
|
|
|
|
|
|
|
We are very strict about what features we add to the Moose core, especially |
1097
|
|
|
|
|
|
|
the user-visible features. Instead we have made sure that the underlying |
1098
|
|
|
|
|
|
|
meta-system of Moose is as extensible as possible so that you can add your |
1099
|
|
|
|
|
|
|
own features easily. |
1100
|
|
|
|
|
|
|
|
1101
|
|
|
|
|
|
|
That said, occasionally there is a feature needed in the meta-system |
1102
|
|
|
|
|
|
|
to support your planned extension, in which case you should either |
1103
|
|
|
|
|
|
|
email the mailing list (moose@perl.org) or join us on IRC at |
1104
|
|
|
|
|
|
|
L<irc://irc.perl.org/#moose> to discuss. The |
1105
|
|
|
|
|
|
|
L<Moose::Manual::Contributing> has more detail about how and when you |
1106
|
|
|
|
|
|
|
can contribute. |
1107
|
|
|
|
|
|
|
|
1108
|
|
|
|
|
|
|
=head1 CABAL |
1109
|
|
|
|
|
|
|
|
1110
|
|
|
|
|
|
|
There are only a few people with the rights to release a new version |
1111
|
|
|
|
|
|
|
of Moose. The Moose Cabal are the people to go to with questions regarding |
1112
|
|
|
|
|
|
|
the wider purview of Moose. They help maintain not just the code |
1113
|
|
|
|
|
|
|
but the community as well. See the list below under L</AUTHORS>. |
1114
|
|
|
|
|
|
|
|
1115
|
|
|
|
|
|
|
=head1 CONTRIBUTORS |
1116
|
|
|
|
|
|
|
|
1117
|
|
|
|
|
|
|
Moose is a community project, and as such, involves the work of many, many |
1118
|
|
|
|
|
|
|
members of the community beyond just the members in the cabal. In particular: |
1119
|
|
|
|
|
|
|
|
1120
|
|
|
|
|
|
|
Dave (autarch) Rolsky wrote most of the documentation in L<Moose::Manual>. |
1121
|
|
|
|
|
|
|
|
1122
|
|
|
|
|
|
|
John (jgoulah) Goulah wrote L<Moose::Cookbook::Snack::Keywords>. |
1123
|
|
|
|
|
|
|
|
1124
|
|
|
|
|
|
|
Jess (castaway) Robinson wrote L<Moose::Cookbook::Snack::Types>. |
1125
|
|
|
|
|
|
|
|
1126
|
|
|
|
|
|
|
Aran (bluefeet) Clary Deltac wrote |
1127
|
|
|
|
|
|
|
L<Moose::Cookbook::Basics::Genome_OverloadingSubtypesAndCoercion>. |
1128
|
|
|
|
|
|
|
|
1129
|
|
|
|
|
|
|
Anders (Debolaz) Nor Berle contributed L<Test::Moose> and L<Moose::Util>. |
1130
|
|
|
|
|
|
|
|
1131
|
|
|
|
|
|
|
Also, the code in L<Moose::Meta::Attribute::Native> is based on code from the |
1132
|
|
|
|
|
|
|
L<MooseX::AttributeHelpers> distribution, which had contributions from: |
1133
|
|
|
|
|
|
|
|
1134
|
|
|
|
|
|
|
Chris (perigrin) Prather |
1135
|
|
|
|
|
|
|
|
1136
|
|
|
|
|
|
|
Cory (gphat) Watson |
1137
|
|
|
|
|
|
|
|
1138
|
|
|
|
|
|
|
Evan Carroll |
1139
|
|
|
|
|
|
|
|
1140
|
|
|
|
|
|
|
Florian (rafl) Ragwitz |
1141
|
|
|
|
|
|
|
|
1142
|
|
|
|
|
|
|
Jason May |
1143
|
|
|
|
|
|
|
|
1144
|
|
|
|
|
|
|
Jay Hannah |
1145
|
|
|
|
|
|
|
|
1146
|
|
|
|
|
|
|
Jesse (doy) Luehrs |
1147
|
|
|
|
|
|
|
|
1148
|
|
|
|
|
|
|
Paul (frodwith) Driver |
1149
|
|
|
|
|
|
|
|
1150
|
|
|
|
|
|
|
Robert (rlb3) Boone |
1151
|
|
|
|
|
|
|
|
1152
|
|
|
|
|
|
|
Robert Buels |
1153
|
|
|
|
|
|
|
|
1154
|
|
|
|
|
|
|
Robert (phaylon) Sedlacek |
1155
|
|
|
|
|
|
|
|
1156
|
|
|
|
|
|
|
Shawn (Sartak) Moore |
1157
|
|
|
|
|
|
|
|
1158
|
|
|
|
|
|
|
Stevan Little |
1159
|
|
|
|
|
|
|
|
1160
|
|
|
|
|
|
|
Tom (dec) Lanyon |
1161
|
|
|
|
|
|
|
|
1162
|
|
|
|
|
|
|
Yuval Kogman |
1163
|
|
|
|
|
|
|
|
1164
|
|
|
|
|
|
|
Finally, these people also contributed various tests, bug fixes, |
1165
|
|
|
|
|
|
|
documentation, and features to the Moose codebase: |
1166
|
|
|
|
|
|
|
|
1167
|
|
|
|
|
|
|
Aankhen |
1168
|
|
|
|
|
|
|
|
1169
|
|
|
|
|
|
|
Adam (Alias) Kennedy |
1170
|
|
|
|
|
|
|
|
1171
|
|
|
|
|
|
|
Christian (chansen) Hansen |
1172
|
|
|
|
|
|
|
|
1173
|
|
|
|
|
|
|
Cory (gphat) Watson |
1174
|
|
|
|
|
|
|
|
1175
|
|
|
|
|
|
|
Dylan Hardison (doc fixes) |
1176
|
|
|
|
|
|
|
|
1177
|
|
|
|
|
|
|
Eric (ewilhelm) Wilhelm |
1178
|
|
|
|
|
|
|
|
1179
|
|
|
|
|
|
|
Evan Carroll |
1180
|
|
|
|
|
|
|
|
1181
|
|
|
|
|
|
|
Guillermo (groditi) Roditi |
1182
|
|
|
|
|
|
|
|
1183
|
|
|
|
|
|
|
Jason May |
1184
|
|
|
|
|
|
|
|
1185
|
|
|
|
|
|
|
Jay Hannah |
1186
|
|
|
|
|
|
|
|
1187
|
|
|
|
|
|
|
Jonathan (jrockway) Rockway |
1188
|
|
|
|
|
|
|
|
1189
|
|
|
|
|
|
|
Matt (mst) Trout |
1190
|
|
|
|
|
|
|
|
1191
|
|
|
|
|
|
|
Nathan (kolibrie) Gray |
1192
|
|
|
|
|
|
|
|
1193
|
|
|
|
|
|
|
Paul (frodwith) Driver |
1194
|
|
|
|
|
|
|
|
1195
|
|
|
|
|
|
|
Piotr (dexter) Roszatycki |
1196
|
|
|
|
|
|
|
|
1197
|
|
|
|
|
|
|
Robert Buels |
1198
|
|
|
|
|
|
|
|
1199
|
|
|
|
|
|
|
Robert (phaylon) Sedlacek |
1200
|
|
|
|
|
|
|
|
1201
|
|
|
|
|
|
|
Robert (rlb3) Boone |
1202
|
|
|
|
|
|
|
|
1203
|
|
|
|
|
|
|
Sam (mugwump) Vilain |
1204
|
|
|
|
|
|
|
|
1205
|
|
|
|
|
|
|
Scott (konobi) McWhirter |
1206
|
|
|
|
|
|
|
|
1207
|
|
|
|
|
|
|
Shlomi (rindolf) Fish |
1208
|
|
|
|
|
|
|
|
1209
|
|
|
|
|
|
|
Tom (dec) Lanyon |
1210
|
|
|
|
|
|
|
|
1211
|
|
|
|
|
|
|
Wallace (wreis) Reis |
1212
|
|
|
|
|
|
|
|
1213
|
|
|
|
|
|
|
... and many other #moose folks |
1214
|
|
|
|
|
|
|
|
1215
|
|
|
|
|
|
|
=head1 AUTHORS |
1216
|
|
|
|
|
|
|
|
1217
|
|
|
|
|
|
|
=over 4 |
1218
|
|
|
|
|
|
|
|
1219
|
|
|
|
|
|
|
=item * |
1220
|
|
|
|
|
|
|
|
1221
|
|
|
|
|
|
|
Stevan Little <stevan@cpan.org> |
1222
|
|
|
|
|
|
|
|
1223
|
|
|
|
|
|
|
=item * |
1224
|
|
|
|
|
|
|
|
1225
|
|
|
|
|
|
|
Dave Rolsky <autarch@urth.org> |
1226
|
|
|
|
|
|
|
|
1227
|
|
|
|
|
|
|
=item * |
1228
|
|
|
|
|
|
|
|
1229
|
|
|
|
|
|
|
Jesse Luehrs <doy@cpan.org> |
1230
|
|
|
|
|
|
|
|
1231
|
|
|
|
|
|
|
=item * |
1232
|
|
|
|
|
|
|
|
1233
|
|
|
|
|
|
|
Shawn M Moore <sartak@cpan.org> |
1234
|
|
|
|
|
|
|
|
1235
|
|
|
|
|
|
|
=item * |
1236
|
|
|
|
|
|
|
|
1237
|
|
|
|
|
|
|
יובל קוג'מן (Yuval Kogman) <nothingmuch@woobling.org> |
1238
|
|
|
|
|
|
|
|
1239
|
|
|
|
|
|
|
=item * |
1240
|
|
|
|
|
|
|
|
1241
|
|
|
|
|
|
|
Karen Etheridge <ether@cpan.org> |
1242
|
|
|
|
|
|
|
|
1243
|
|
|
|
|
|
|
=item * |
1244
|
|
|
|
|
|
|
|
1245
|
|
|
|
|
|
|
Florian Ragwitz <rafl@debian.org> |
1246
|
|
|
|
|
|
|
|
1247
|
|
|
|
|
|
|
=item * |
1248
|
|
|
|
|
|
|
|
1249
|
|
|
|
|
|
|
Hans Dieter Pearcey <hdp@cpan.org> |
1250
|
|
|
|
|
|
|
|
1251
|
|
|
|
|
|
|
=item * |
1252
|
|
|
|
|
|
|
|
1253
|
|
|
|
|
|
|
Chris Prather <chris@prather.org> |
1254
|
|
|
|
|
|
|
|
1255
|
|
|
|
|
|
|
=item * |
1256
|
|
|
|
|
|
|
|
1257
|
|
|
|
|
|
|
Matt S Trout <mstrout@cpan.org> |
1258
|
|
|
|
|
|
|
|
1259
|
|
|
|
|
|
|
=back |
1260
|
|
|
|
|
|
|
|
1261
|
|
|
|
|
|
|
=head1 COPYRIGHT AND LICENSE |
1262
|
|
|
|
|
|
|
|
1263
|
|
|
|
|
|
|
This software is copyright (c) 2006 by Infinity Interactive, Inc. |
1264
|
|
|
|
|
|
|
|
1265
|
|
|
|
|
|
|
This is free software; you can redistribute it and/or modify it under |
1266
|
|
|
|
|
|
|
the same terms as the Perl 5 programming language system itself. |
1267
|
|
|
|
|
|
|
|
1268
|
|
|
|
|
|
|
=cut |