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