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