changelog
[gitmo/Moose.git] / lib / Moose.pm
CommitLineData
fcd84ca9 1
2package Moose;
3
4use strict;
5use warnings;
6
a94188ac 7our $VERSION = '0.56';
d44714be 8our $AUTHORITY = 'cpan:STEVAN';
fcd84ca9 9
21f1e231 10use Scalar::Util 'blessed';
c0b37457 11use Carp 'confess', 'croak', 'cluck';
fcd84ca9 12
5bd4db9b 13use Moose::Exporter;
7f18097c 14
46217c9c 15use Class::MOP 0.64;
ef1d5f4b 16
c0e30cf5 17use Moose::Meta::Class;
7415b2cb 18use Moose::Meta::TypeConstraint;
7c13858b 19use Moose::Meta::TypeCoercion;
78cd1d3b 20use Moose::Meta::Attribute;
ddd0ec20 21use Moose::Meta::Instance;
c0e30cf5 22
0779da92 23use Moose::Object;
24
d67145ed 25use Moose::Meta::Role;
0779da92 26use Moose::Meta::Role::Composite;
27use Moose::Meta::Role::Application;
28use Moose::Meta::Role::Application::RoleSummation;
29use Moose::Meta::Role::Application::ToClass;
30use Moose::Meta::Role::Application::ToRole;
31use Moose::Meta::Role::Application::ToInstance;
32use Moose::Meta::Role::Application::ToMetaclassInstance;
d67145ed 33
7415b2cb 34use Moose::Util::TypeConstraints;
d7d8a8c7 35use Moose::Util ();
a15dff8d 36
5bd4db9b 37sub extends {
97a93056 38 my $class = shift;
3d544ed5 39
5bd4db9b 40 croak "Must derive at least one class" unless @_;
9bcfbab1 41
5bd4db9b 42 my @supers = @_;
43 foreach my $super (@supers) {
44 Class::MOP::load_class($super);
45 croak "You cannot inherit from a Moose Role ($super)"
46 if $super->can('meta') &&
47 blessed $super->meta &&
48 $super->meta->isa('Moose::Meta::Role')
c92c1205 49 }
5bee491d 50
26fbace8 51
86dd5d11 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
50d5df60 56 my $meta = Moose::Meta::Class->initialize($class)->_fix_metaclass_incompatability(@supers);
5bd4db9b 57 $meta->superclasses(@supers);
58}
a3c7e2fe 59
5bd4db9b 60sub with {
97a93056 61 my $class = shift;
aedcb7d9 62 Moose::Util::apply_all_roles(Class::MOP::Class->initialize($class), @_);
5bd4db9b 63}
9bcfbab1 64
5bd4db9b 65sub has {
97a93056 66 my $class = shift;
5bd4db9b 67 my $name = shift;
68 croak 'Usage: has \'name\' => ( key => value, ... )' if @_ == 1;
69 my %options = @_;
70 my $attrs = ( ref($name) eq 'ARRAY' ) ? $name : [ ($name) ];
aedcb7d9 71 Class::MOP::Class->initialize($class)->add_attribute( $_, %options ) for @$attrs;
5bd4db9b 72}
9bcfbab1 73
5bd4db9b 74sub before {
97a93056 75 my $class = shift;
5bd4db9b 76 Moose::Util::add_method_modifier($class, 'before', \@_);
77}
78
79sub after {
97a93056 80 my $class = shift;
5bd4db9b 81 Moose::Util::add_method_modifier($class, 'after', \@_);
82}
83
84sub around {
97a93056 85 my $class = shift;
5bd4db9b 86 Moose::Util::add_method_modifier($class, 'around', \@_);
87}
88
89sub super {
90 return unless our $SUPER_BODY; $SUPER_BODY->(our @SUPER_ARGS);
91}
9bcfbab1 92
5bd4db9b 93sub override {
97a93056 94 my $class = shift;
5bd4db9b 95 my ( $name, $method ) = @_;
aedcb7d9 96 Class::MOP::Class->initialize($class)->add_override_method_modifier( $name => $method );
5bd4db9b 97}
9bcfbab1 98
5bd4db9b 99sub inner {
100 my $pkg = caller();
101 our ( %INNER_BODY, %INNER_ARGS );
102
103 if ( my $body = $INNER_BODY{$pkg} ) {
104 my @args = @{ $INNER_ARGS{$pkg} };
105 local $INNER_ARGS{$pkg};
106 local $INNER_BODY{$pkg};
107 return $body->(@args);
108 } else {
109 return;
ce265cc3 110 }
5bd4db9b 111}
9bcfbab1 112
5bd4db9b 113sub augment {
97a93056 114 my $class = shift;
5bd4db9b 115 my ( $name, $method ) = @_;
aedcb7d9 116 Class::MOP::Class->initialize($class)->add_augment_method_modifier( $name => $method );
ce265cc3 117}
9bcfbab1 118
5bd4db9b 119sub make_immutable {
97a93056 120 my $class = shift;
5bd4db9b 121 cluck "The make_immutable keyword has been deprecated, " .
122 "please go back to __PACKAGE__->meta->make_immutable\n";
aedcb7d9 123 Class::MOP::Class->initialize($class)->make_immutable(@_);
5bd4db9b 124}
9bcfbab1 125
aedcb7d9 126Moose::Exporter->setup_import_methods(
97a93056 127 with_caller => [
128 qw( extends with has before after around override augment make_immutable )
129 ],
130 as_is => [
131 qw( super inner ),
5bd4db9b 132 \&Carp::confess,
133 \&Scalar::Util::blessed,
134 ],
135);
136
cc841c0e 137sub init_meta {
085fba61 138 # This used to be called as a function. This hack preserves
139 # backwards compatibility.
140 if ( $_[0] ne __PACKAGE__ ) {
141 return __PACKAGE__->init_meta(
142 for_class => $_[0],
143 base_class => $_[1],
144 metaclass => $_[2],
145 );
146 }
7c4676ef 147
0338a411 148 shift;
149 my %args = @_;
150
151 my $class = $args{for_class}
085fba61 152 or confess "Cannot call init_meta without specifying a for_class";
153 my $base_class = $args{base_class} || 'Moose::Object';
154 my $metaclass = $args{metaclass} || 'Moose::Meta::Class';
cc841c0e 155
156 confess
157 "The Metaclass $metaclass must be a subclass of Moose::Meta::Class."
158 unless $metaclass->isa('Moose::Meta::Class');
159
160 # make a subtype for each Moose class
161 class_type($class)
162 unless find_type_constraint($class);
163
164 my $meta;
50d5df60 165
166 if ( $meta = Class::MOP::get_metaclass_by_name($class) ) {
167 unless ( $meta->isa("Moose::Meta::Class") ) {
168 confess "$class already has a metaclass, but it does not inherit $metaclass ($meta)";
169 }
170 } else {
171 # no metaclass, no 'meta' method
172
173 # now we check whether our ancestors have metaclass, and if so borrow that
174 my ( undef, @isa ) = @{ $class->mro::get_linear_isa };
175
176 foreach my $ancestor ( @isa ) {
177 my $ancestor_meta = Class::MOP::get_metaclass_by_name($ancestor) || next;
178
179 my $ancestor_meta_class = ($ancestor_meta->is_immutable
180 ? $ancestor_meta->get_mutable_metaclass_name
181 : ref($ancestor_meta));
182
183 # if we have an ancestor metaclass that inherits $metaclass, we use
184 # that. This is like _fix_metaclass_incompatability, but we can do it now.
185
186 # the case of having an ancestry is not very common, but arises in
187 # e.g. Reaction
188 unless ( $metaclass->isa( $ancestor_meta_class ) ) {
189 if ( $ancestor_meta_class->isa($metaclass) ) {
190 $metaclass = $ancestor_meta_class;
191 }
192 }
193 }
194
195 $meta = $metaclass->initialize($class);
196 }
197
cc841c0e 198 if ( $class->can('meta') ) {
50d5df60 199 # check 'meta' method
200
201 # it may be inherited
202
cc841c0e 203 # NOTE:
204 # this is the case where the metaclass pragma
205 # was used before the 'use Moose' statement to
206 # override a specific class
50d5df60 207 my $method_meta = $class->meta;
208
209 ( blessed($method_meta) && $method_meta->isa('Moose::Meta::Class') )
210 || confess "$class already has a &meta function, but it does not return a Moose::Meta::Class ($meta)";
211
212 $meta = $method_meta;
cc841c0e 213 }
50d5df60 214
215 unless ( $meta->has_method("meta") ) { # don't overwrite
216 # also check for inherited non moose 'meta' method?
217 # FIXME also skip this if the user requested by passing an option
cc841c0e 218 $meta->add_method(
219 'meta' => sub {
220 # re-initialize so it inherits properly
50d5df60 221 $metaclass->initialize( ref($_[0]) || $_[0] );
cc841c0e 222 }
223 );
224 }
225
226 # make sure they inherit from Moose::Object
227 $meta->superclasses($base_class)
228 unless $meta->superclasses();
229
230 return $meta;
231}
232
085fba61 233# This may be used in some older MooseX extensions.
234sub _get_caller {
235 goto &Moose::Exporter::_get_caller;
236}
237
8ecb1fa0 238## make 'em all immutable
239
240$_->meta->make_immutable(
0779da92 241 inline_constructor => 1,
242 constructor_name => "_new",
77a18c28 243 inline_accessors => 1, # these are Class::MOP accessors, so they need inlining
9bcfbab1 244 )
0779da92 245 for (qw(
246 Moose::Meta::Attribute
247 Moose::Meta::Class
248 Moose::Meta::Instance
249
250 Moose::Meta::TypeConstraint
251 Moose::Meta::TypeConstraint::Union
252 Moose::Meta::TypeConstraint::Parameterized
9ad786af 253 Moose::Meta::TypeConstraint::Parameterizable
0779da92 254 Moose::Meta::TypeConstraint::Enum
255 Moose::Meta::TypeConstraint::Class
256 Moose::Meta::TypeConstraint::Role
257 Moose::Meta::TypeConstraint::Registry
258 Moose::Meta::TypeCoercion
259 Moose::Meta::TypeCoercion::Union
260
261 Moose::Meta::Method
262 Moose::Meta::Method::Accessor
263 Moose::Meta::Method::Constructor
264 Moose::Meta::Method::Destructor
265 Moose::Meta::Method::Overriden
266 Moose::Meta::Method::Augmented
267
268 Moose::Meta::Role
269 Moose::Meta::Role::Method
270 Moose::Meta::Role::Method::Required
271
272 Moose::Meta::Role::Composite
273
274 Moose::Meta::Role::Application
275 Moose::Meta::Role::Application::RoleSummation
276 Moose::Meta::Role::Application::ToClass
277 Moose::Meta::Role::Application::ToRole
278 Moose::Meta::Role::Application::ToInstance
279 Moose::Meta::Role::Application::ToMetaclassInstance
280));
8ecb1fa0 281
fcd84ca9 2821;
283
284__END__
285
286=pod
287
288=head1 NAME
289
8bdc7f13 290Moose - A postmodern object system for Perl 5
fcd84ca9 291
292=head1 SYNOPSIS
e522431d 293
294 package Point;
1cd45431 295 use Moose; # automatically turns on strict and warnings
26fbace8 296
43d599e5 297 has 'x' => (is => 'rw', isa => 'Int');
298 has 'y' => (is => 'rw', isa => 'Int');
26fbace8 299
e522431d 300 sub clear {
301 my $self = shift;
302 $self->x(0);
26fbace8 303 $self->y(0);
e522431d 304 }
26fbace8 305
e522431d 306 package Point3D;
307 use Moose;
26fbace8 308
e522431d 309 extends 'Point';
26fbace8 310
43d599e5 311 has 'z' => (is => 'rw', isa => 'Int');
26fbace8 312
e522431d 313 after 'clear' => sub {
314 my $self = shift;
43d599e5 315 $self->z(0);
26fbace8 316 };
2c0cbef7 317
fcd84ca9 318=head1 DESCRIPTION
319
26fbace8 320Moose is an extension of the Perl 5 object system.
e522431d 321
9b9da6f1 322The main goal of Moose is to make Perl 5 Object Oriented programming
323easier, more consistent and less tedious. With Moose you can to think
324more about what you want to do and less about the mechanics of OOP.
fcd84ca9 325
9b9da6f1 326Additionally, Moose is built on top of L<Class::MOP>, which is a
327metaclass system for Perl 5. This means that Moose not only makes
328building normal Perl 5 objects better, but it provides the power of
329metaclass programming as well.
8bdc7f13 330
f5909dca 331=head2 New to Moose?
332
5185f954 333If you're new to Moose, the best place to start is the
334L<Moose::Cookbook>. The recipes on Moose basics will get you up to
335speed with many of Moose's features quickly. Once you have an idea of
336what Moose can do, you can use the API documentation to get more
337detail on features which interest you.
f5909dca 338
28669f89 339=head2 Moose Extensions
340
12aed9a0 341The C<MooseX::> namespace is the official place to find Moose extensions.
342These extensions can be found on the CPAN. The easiest way to find them
343is to search for them (L<http://search.cpan.org/search?query=MooseX::>),
344or to examine L<Task::Moose> which aims to keep an up-to-date, easily
345installable list of Moose extensions.
28669f89 346
6ba6d68c 347=head1 BUILDING CLASSES WITH MOOSE
348
68efb014 349Moose makes every attempt to provide as much convenience as possible during
350class construction/definition, but still stay out of your way if you want it
351to. Here are a few items to note when building classes with Moose.
6ba6d68c 352
26fbace8 353Unless specified with C<extends>, any class which uses Moose will
6ba6d68c 354inherit from L<Moose::Object>.
355
1cd45431 356Moose will also manage all attributes (including inherited ones) that are
357defined with C<has>. And (assuming you call C<new>, which is inherited from
358L<Moose::Object>) this includes properly initializing all instance slots,
359setting defaults where appropriate, and performing any type constraint checking
360or coercion.
6ba6d68c 361
004222dc 362=head1 PROVIDED METHODS
6ba6d68c 363
004222dc 364Moose provides a number of methods to all your classes, mostly through the
365inheritance of L<Moose::Object>. There is however, one exception.
6ba6d68c 366
367=over 4
368
369=item B<meta>
370
371This is a method which provides access to the current class's metaclass.
372
004222dc 373=back
374
375=head1 EXPORTED FUNCTIONS
376
377Moose will export a number of functions into the class's namespace which
378may then be used to set up the class. These functions all work directly
379on the current class.
380
381=over 4
382
6ba6d68c 383=item B<extends (@superclasses)>
384
385This function will set the superclass(es) for the current class.
386
26fbace8 387This approach is recommended instead of C<use base>, because C<use base>
388actually C<push>es onto the class's C<@ISA>, whereas C<extends> will
389replace it. This is important to ensure that classes which do not have
68efb014 390superclasses still properly inherit from L<Moose::Object>.
6ba6d68c 391
43d599e5 392=item B<with (@roles)>
e9ec68d6 393
004222dc 394This will apply a given set of C<@roles> to the local class.
e9ec68d6 395
cd7eeaf5 396=item B<has $name =E<gt> %options>
6ba6d68c 397
26fbace8 398This will install an attribute of a given C<$name> into the current class.
399The C<%options> are the same as those provided by
400L<Class::MOP::Attribute>, in addition to the list below which are provided
43d599e5 401by Moose (L<Moose::Meta::Attribute> to be more specific):
6ba6d68c 402
403=over 4
404
076c81ed 405=item I<is =E<gt> 'rw'|'ro'>
6ba6d68c 406
26fbace8 407The I<is> option accepts either I<rw> (for read/write) or I<ro> (for read
408only). These will create either a read/write accessor or a read-only
6ba6d68c 409accessor respectively, using the same name as the C<$name> of the attribute.
410
1cd45431 411If you need more control over how your accessors are named, you can use the
412I<reader>, I<writer> and I<accessor> options inherited from
004222dc 413L<Class::MOP::Attribute>, however if you use those, you won't need the I<is>
414option.
6ba6d68c 415
076c81ed 416=item I<isa =E<gt> $type_name>
6ba6d68c 417
26fbace8 418The I<isa> option uses Moose's type constraint facilities to set up runtime
419type checking for this attribute. Moose will perform the checks during class
420construction, and within any accessors. The C<$type_name> argument must be a
421string. The string may be either a class name or a type defined using
9cca2e9e 422Moose's type definition features. (Refer to L<Moose::Util::TypeConstraints>
c2a69ef1 423for information on how to define a new type, and how to retrieve type meta-data).
6ba6d68c 424
daea75c9 425=item I<coerce =E<gt> (1|0)>
426
26fbace8 427This will attempt to use coercion with the supplied type constraint to change
428the value passed into any accessors or constructors. You B<must> have supplied
5cfe3805 429a type constraint in order for this to work. See L<Moose::Cookbook::Basics::Recipe5>
1cd45431 430for an example.
daea75c9 431
432=item I<does =E<gt> $role_name>
433
26fbace8 434This will accept the name of a role which the value stored in this attribute
daea75c9 435is expected to have consumed.
436
437=item I<required =E<gt> (1|0)>
438
26fbace8 439This marks the attribute as being required. This means a I<defined> value must be
440supplied during class construction, and the attribute may never be set to
441C<undef> with an accessor.
daea75c9 442
443=item I<weak_ref =E<gt> (1|0)>
444
68efb014 445This will tell the class to store the value of this attribute as a weakened
446reference. If an attribute is a weakened reference, it B<cannot> also be
447coerced.
daea75c9 448
449=item I<lazy =E<gt> (1|0)>
450
26fbace8 451This will tell the class to not create this slot until absolutely necessary.
daea75c9 452If an attribute is marked as lazy it B<must> have a default supplied.
453
9e93dd19 454=item I<auto_deref =E<gt> (1|0)>
455
26fbace8 456This tells the accessor whether to automatically dereference the value returned.
1cd45431 457This is only legal if your C<isa> option is either C<ArrayRef> or C<HashRef>.
9e93dd19 458
65e14c86 459=item I<trigger =E<gt> $code>
460
461The I<trigger> option is a CODE reference which will be called after the value of
462the attribute is set. The CODE ref will be passed the instance itself, the
463updated value and the attribute meta-object (this is for more advanced fiddling
464and can typically be ignored). You B<cannot> have a trigger on a read-only
465attribute.
daea75c9 466
c84f324f 467=item I<handles =E<gt> ARRAY | HASH | REGEXP | ROLE | CODE>
2c0cbef7 468
26fbace8 469The I<handles> option provides Moose classes with automated delegation features.
470This is a pretty complex and powerful option. It accepts many different option
471formats, each with its own benefits and drawbacks.
38e3283b 472
1cd45431 473B<NOTE:> The class being delegated to does not need to be a Moose based class,
474which is why this feature is especially useful when wrapping non-Moose classes.
38e3283b 475
1cd45431 476All I<handles> option formats share the following traits:
38e3283b 477
1cd45431 478You cannot override a locally defined method with a delegated method; an
479exception will be thrown if you try. That is to say, if you define C<foo> in
480your class, you cannot override it with a delegated C<foo>. This is almost never
481something you would want to do, and if it is, you should do it by hand and not
482use Moose.
38e3283b 483
1cd45431 484You cannot override any of the methods found in Moose::Object, or the C<BUILD>
485and C<DEMOLISH> methods. These will not throw an exception, but will silently
486move on to the next method in the list. My reasoning for this is that you would
487almost never want to do this, since it usually breaks your class. As with
488overriding locally defined methods, if you do want to do this, you should do it
489manually, not with Moose.
38e3283b 490
f3c4e20e 491You do not I<need> to have a reader (or accessor) for the attribute in order
492to delegate to it. Moose will create a means of accessing the value for you,
493however this will be several times B<less> efficient then if you had given
494the attribute a reader (or accessor) to use.
495
38e3283b 496Below is the documentation for each option format:
497
498=over 4
499
500=item C<ARRAY>
501
26fbace8 502This is the most common usage for I<handles>. You basically pass a list of
503method names to be delegated, and Moose will install a delegation method
1cd45431 504for each one.
38e3283b 505
506=item C<HASH>
507
26fbace8 508This is the second most common usage for I<handles>. Instead of a list of
509method names, you pass a HASH ref where each key is the method name you
510want installed locally, and its value is the name of the original method
511in the class being delegated to.
fd595040 512
26fbace8 513This can be very useful for recursive classes like trees. Here is a
5cfe3805 514quick example (soon to be expanded into a Moose::Cookbook recipe):
38e3283b 515
1cd45431 516 package Tree;
38e3283b 517 use Moose;
26fbace8 518
38e3283b 519 has 'node' => (is => 'rw', isa => 'Any');
26fbace8 520
38e3283b 521 has 'children' => (
522 is => 'ro',
523 isa => 'ArrayRef',
524 default => sub { [] }
525 );
26fbace8 526
38e3283b 527 has 'parent' => (
528 is => 'rw',
529 isa => 'Tree',
a4e516f6 530 weak_ref => 1,
38e3283b 531 handles => {
532 parent_node => 'node',
26fbace8 533 siblings => 'children',
38e3283b 534 }
535 );
536
1cd45431 537In this example, the Tree package gets C<parent_node> and C<siblings> methods,
538which delegate to the C<node> and C<children> methods (respectively) of the Tree
26fbace8 539instance stored in the C<parent> slot.
38e3283b 540
541=item C<REGEXP>
542
26fbace8 543The regexp option works very similar to the ARRAY option, except that it builds
544the list of methods for you. It starts by collecting all possible methods of the
545class being delegated to, then filters that list using the regexp supplied here.
38e3283b 546
26fbace8 547B<NOTE:> An I<isa> option is required when using the regexp option format. This
548is so that we can determine (at compile time) the method list from the class.
38e3283b 549Without an I<isa> this is just not possible.
550
c84f324f 551=item C<ROLE>
552
26fbace8 553With the role option, you specify the name of a role whose "interface" then
554becomes the list of methods to handle. The "interface" can be defined as; the
555methods of the role and any required methods of the role. It should be noted
556that this does B<not> include any method modifiers or generated attribute
c84f324f 557methods (which is consistent with role composition).
558
38e3283b 559=item C<CODE>
560
1cd45431 561This is the option to use when you really want to do something funky. You should
562only use it if you really know what you are doing, as it involves manual
563metaclass twiddling.
38e3283b 564
1cd45431 565This takes a code reference, which should expect two arguments. The first is the
566attribute meta-object this I<handles> is attached to. The second is the
567metaclass of the class being delegated to. It expects you to return a hash (not
26fbace8 568a HASH ref) of the methods you want mapped.
38e3283b 569
570=back
2c0cbef7 571
004222dc 572=item I<metaclass =E<gt> $metaclass_name>
573
574This tells the class to use a custom attribute metaclass for this particular
575attribute. Custom attribute metaclasses are useful for extending the
576capabilities of the I<has> keyword: they are the simplest way to extend the MOP,
577but they are still a fairly advanced topic and too much to cover here, see
5cfe3805 578L<Moose::Cookbook::Meta::Recipe1> for more information.
004222dc 579
580The default behavior here is to just load C<$metaclass_name>; however, we also
581have a way to alias to a shorter name. This will first look to see if
582B<Moose::Meta::Attribute::Custom::$metaclass_name> exists. If it does, Moose
583will then check to see if that has the method C<register_implementation>, which
584should return the actual name of the custom attribute metaclass. If there is no
585C<register_implementation> method, it will fall back to using
586B<Moose::Meta::Attribute::Custom::$metaclass_name> as the metaclass name.
587
588=item I<traits =E<gt> [ @role_names ]>
589
590This tells Moose to take the list of C<@role_names> and apply them to the
591attribute meta-object. This is very similar to the I<metaclass> option, but
54f2996d 592allows you to use more than one extension at a time.
004222dc 593
54f2996d 594See L<TRAIT NAME RESOLUTION> for details on how a trait name is
595resolved to a class name.
596
597Also see L<Moose::Cookbook::Meta::Recipe3> for a metaclass trait
598example.
004222dc 599
6ba6d68c 600=back
601
cd7eeaf5 602=item B<has +$name =E<gt> %options>
603
26fbace8 604This is variation on the normal attibute creator C<has> which allows you to
8d62bf6d 605clone and extend an attribute from a superclass or from a role. Here is an
606example of the superclass usage:
cd7eeaf5 607
608 package Foo;
609 use Moose;
26fbace8 610
cd7eeaf5 611 has 'message' => (
26fbace8 612 is => 'rw',
cd7eeaf5 613 isa => 'Str',
614 default => 'Hello, I am a Foo'
615 );
26fbace8 616
cd7eeaf5 617 package My::Foo;
618 use Moose;
26fbace8 619
cd7eeaf5 620 extends 'Foo';
26fbace8 621
cd7eeaf5 622 has '+message' => (default => 'Hello I am My::Foo');
623
1cd45431 624What is happening here is that B<My::Foo> is cloning the C<message> attribute
625from its parent class B<Foo>, retaining the C<is =E<gt> 'rw'> and C<isa =E<gt>
626'Str'> characteristics, but changing the value in C<default>.
cd7eeaf5 627
8d62bf6d 628Here is another example, but within the context of a role:
629
630 package Foo::Role;
631 use Moose::Role;
986d175a 632
8d62bf6d 633 has 'message' => (
634 is => 'rw',
635 isa => 'Str',
636 default => 'Hello, I am a Foo'
637 );
986d175a 638
8d62bf6d 639 package My::Foo;
640 use Moose;
986d175a 641
8d62bf6d 642 with 'Foo::Role';
986d175a 643
8d62bf6d 644 has '+message' => (default => 'Hello I am My::Foo');
645
646In this case, we are basically taking the attribute which the role supplied
4032c9bb 647and altering it within the bounds of this feature.
8d62bf6d 648
4032c9bb 649Aside from where the attributes come from (one from superclass, the other
650from a role), this feature works exactly the same. This feature is restricted
651somewhat, so as to try and force at least I<some> sanity into it. You are only
652allowed to change the following attributes:
cd7eeaf5 653
654=over 4
655
26fbace8 656=item I<default>
cd7eeaf5 657
658Change the default value of an attribute.
659
26fbace8 660=item I<coerce>
cd7eeaf5 661
662Change whether the attribute attempts to coerce a value passed to it.
663
26fbace8 664=item I<required>
cd7eeaf5 665
666Change if the attribute is required to have a value.
667
668=item I<documentation>
669
670Change the documentation string associated with the attribute.
671
83cc9094 672=item I<lazy>
673
674Change if the attribute lazily initializes the slot.
675
cd7eeaf5 676=item I<isa>
677
aed87761 678You I<are> allowed to change the type without restriction.
679
680It is recommended that you use this freedom with caution. We used to
681only allow for extension only if the type was a subtype of the parent's
682type, but we felt that was too restrictive and is better left as a
683policy descision.
cd7eeaf5 684
83cc9094 685=item I<handles>
686
26fbace8 687You are allowed to B<add> a new C<handles> definition, but you are B<not>
688allowed to I<change> one.
83cc9094 689
8d62bf6d 690=item I<builder>
691
692You are allowed to B<add> a new C<builder> definition, but you are B<not>
693allowed to I<change> one.
694
13284479 695=item I<metaclass>
696
697You are allowed to B<add> a new C<metaclass> definition, but you are
698B<not> allowed to I<change> one.
699
700=item I<traits>
701
702You are allowed to B<add> additional traits to the C<traits> definition.
703These traits will be composed into the attribute, but pre-existing traits
704B<are not> overridden, or removed.
705
cd7eeaf5 706=back
707
076c81ed 708=item B<before $name|@names =E<gt> sub { ... }>
6ba6d68c 709
076c81ed 710=item B<after $name|@names =E<gt> sub { ... }>
6ba6d68c 711
076c81ed 712=item B<around $name|@names =E<gt> sub { ... }>
6ba6d68c 713
d8af92ae 714This three items are syntactic sugar for the before, after, and around method
715modifier features that L<Class::MOP> provides. More information on these may be
716found in the L<Class::MOP::Class documentation|Class::MOP::Class/"Method
717Modifiers"> for now.
6ba6d68c 718
159da176 719=item B<super>
720
26fbace8 721The keyword C<super> is a no-op when called outside of an C<override> method. In
722the context of an C<override> method, it will call the next most appropriate
159da176 723superclass method with the same arguments as the original method.
724
725=item B<override ($name, &sub)>
726
26fbace8 727An C<override> method is a way of explicitly saying "I am overriding this
728method from my superclass". You can call C<super> within this method, and
729it will work as expected. The same thing I<can> be accomplished with a normal
730method call and the C<SUPER::> pseudo-package; it is really your choice.
159da176 731
732=item B<inner>
733
26fbace8 734The keyword C<inner>, much like C<super>, is a no-op outside of the context of
735an C<augment> method. You can think of C<inner> as being the inverse of
68efb014 736C<super>; the details of how C<inner> and C<augment> work is best described in
5cfe3805 737the L<Moose::Cookbook::Basics::Recipe6>.
159da176 738
739=item B<augment ($name, &sub)>
740
26fbace8 741An C<augment> method, is a way of explicitly saying "I am augmenting this
742method from my superclass". Once again, the details of how C<inner> and
5cfe3805 743C<augment> work is best described in the L<Moose::Cookbook::Basics::Recipe6>.
159da176 744
6ba6d68c 745=item B<confess>
746
68efb014 747This is the C<Carp::confess> function, and exported here because I use it
004222dc 748all the time.
6ba6d68c 749
750=item B<blessed>
751
1cd45431 752This is the C<Scalar::Util::blessed> function, it is exported here because I
26fbace8 753use it all the time. It is highly recommended that this is used instead of
6ba6d68c 754C<ref> anywhere you need to test for an object's class name.
755
756=back
757
54f2996d 758=head1 METACLASS TRAITS
759
760When you use Moose, you can also specify traits which will be applied
761to your metaclass:
762
763 use Moose -traits => 'My::Trait';
764
765This is very similar to the attribute traits feature. When you do
766this, your class's C<meta> object will have the specified traits
767applied to it. See L<TRAIT NAME RESOLUTION> for more details.
768
769=head1 TRAIT NAME RESOLUTION
770
771By default, when given a trait name, Moose simply tries to load a
772class of the same name. If such a class does not exist, it then looks
773for for a class matching
774B<Moose::Meta::$type::Custom::Trait::$trait_name>. The C<$type>
775variable here will be one of B<Attribute> or B<Class>, depending on
776what the trait is being applied to.
777
778If a class with this long name exists, Moose checks to see if it has
779the method C<register_implementation>. This method is expected to
780return the I<real> class name of the trait. If there is no
781C<register_implementation> method, it will fall back to using
782B<Moose::Meta::$type::Custom::Trait::$trait> as the trait name.
783
784If all this is confusing, take a look at
785L<Moose::Cookbook::Meta::Recipe3>, which demonstrates how to create an
786attribute trait.
787
1cd45431 788=head1 UNIMPORTING FUNCTIONS
31f8ec72 789
790=head2 B<unimport>
791
1cd45431 792Moose offers a way to remove the keywords it exports, through the C<unimport>
31f8ec72 793method. You simply have to say C<no Moose> at the bottom of your code for this
794to work. Here is an example:
795
796 package Person;
797 use Moose;
798
799 has 'first_name' => (is => 'rw', isa => 'Str');
800 has 'last_name' => (is => 'rw', isa => 'Str');
26fbace8 801
802 sub full_name {
31f8ec72 803 my $self = shift;
26fbace8 804 $self->first_name . ' ' . $self->last_name
31f8ec72 805 }
26fbace8 806
807 no Moose; # keywords are removed from the Person package
31f8ec72 808
9bcfbab1 809=head1 EXTENDING AND EMBEDDING MOOSE
810
554b7648 811Moose also offers some options for extending or embedding it into your
812own framework. There are several things you might want to do as part
813of such a framework. First, you probably want to export Moose's sugar
814functions (C<has>, C<extends>, etc) for users of the
815framework. Second, you may want to provide additional sugar of your
816own. Third, you may want to provide your own object base class instead
817of L<Moose::Object>, and/or your own metaclass class instead of
818L<Moose::Meta::Class>.
819
820The exporting needs can be asily satisfied by using
821L<Moose::Exporter>, which is what C<Moose.pm> itself uses for
822exporting. L<Moose::Exporter> lets you "export like Moose".
823
824If you define an C<init_meta> method in a module that uses
825L<Moose::Exporter>, then this method will be called I<before>
826C<Moose.pm>'s own C<init_meta>. This gives you a chance to provide an
827alternate object base class or metaclass class.
828
829Here is a simple example:
9bcfbab1 830
831 package MyFramework;
9bcfbab1 832
554b7648 833 use strict;
834 use warnings;
9bcfbab1 835
554b7648 836 use Moose (); # no need to get Moose's exports
837 use Moose::Exporter;
9bcfbab1 838
aedcb7d9 839 Moose::Exporter->setup_import_methods( also => 'Moose' );
26fbace8 840
554b7648 841 sub init_meta {
842 shift;
843 return Moose->init_meta( @_, base_class => 'MyFramework::Base' );
9bcfbab1 844 }
26fbace8 845
554b7648 846In this example, any class that includes C<use MyFramework> will get
847all of C<Moose.pm>'s sugar functions, and will have their superclass
848set to C<MyFramework::Base>.
9bcfbab1 849
554b7648 850Additionally, that class can include C<no MyFramework> to unimport
851
852=head2 B<< Moose->init_meta(for_class => $class, base_class => $baseclass, metaclass => $metaclass) >>
9bcfbab1 853
554b7648 854The C<init_meta> method sets up the metaclass object for the class
b143539e 855specified by C<for_class>. This method injects a a C<meta> accessor
856into the class so you can get at this object. It also sets the class's
554b7648 857superclass to C<base_class>, with L<Moose::Object> as the default.
9bcfbab1 858
554b7648 859You can specify an alternate metaclass with the C<metaclass> parameter.
26fbace8 860
80837fe1 861For more detail on this topic, see L<Moose::Cookbook::Extending::Recipe2>.
862
554b7648 863This method used to be documented as a function which accepted
864positional parameters. This calling style will still work for
4a66a4b3 865backwards compatibility, but is deprecated.
554b7648 866
867=head2 B<import>
868
869Moose's C<import> method supports the L<Sub::Exporter> form of C<{into =E<gt> $pkg}>
870and C<{into_level =E<gt> 1}>.
871
872B<NOTE>: Doing this is more or less deprecated. Use L<Moose::Exporter>
873instead, which lets you stack multiple C<Moose.pm>-alike modules
874sanely. It handles getting the exported functions into the right place
875for you.
876
05d9eaf6 877=head1 CAVEATS
878
879=over 4
880
881=item *
882
1cd45431 883It should be noted that C<super> and C<inner> B<cannot> be used in the same
884method. However, they may be combined within the same class hierarchy; see
885F<t/014_override_augment_inner_super.t> for an example.
05d9eaf6 886
26fbace8 887The reason for this is that C<super> is only valid within a method
888with the C<override> modifier, and C<inner> will never be valid within an
889C<override> method. In fact, C<augment> will skip over any C<override> methods
68efb014 890when searching for its appropriate C<inner>.
05d9eaf6 891
1cd45431 892This might seem like a restriction, but I am of the opinion that keeping these
893two features separate (yet interoperable) actually makes them easy to use, since
894their behavior is then easier to predict. Time will tell whether I am right or
c84f324f 895not (UPDATE: so far so good).
05d9eaf6 896
004222dc 897=item *
898
899It is important to note that we currently have no simple way of combining
900multiple extended versions of Moose (see L<EXTENDING AND EMBEDDING MOOSE> above),
901and that in many cases they will conflict with one another. We are working on
902developing a way around this issue, but in the meantime, you have been warned.
903
05d9eaf6 904=back
905
9b9da6f1 906=head1 JUSTIFICATION
907
908In case you are still asking yourself "Why do I need this?", then this
909section is for you. This used to be part of the main DESCRIPTION, but
910I think Moose no longer actually needs justification, so it is included
911(read: buried) here for those who are still not convinced.
912
913=over 4
914
915=item Another object system!?!?
916
917Yes, I know there has been an explosion recently of new ways to
918build objects in Perl 5, most of them based on inside-out objects
919and other such things. Moose is different because it is not a new
920object system for Perl 5, but instead an extension of the existing
921object system.
922
923Moose is built on top of L<Class::MOP>, which is a metaclass system
924for Perl 5. This means that Moose not only makes building normal
925Perl 5 objects better, but it also provides the power of metaclass
926programming.
927
928=item Is this for real? Or is this just an experiment?
929
930Moose is I<based> on the prototypes and experiments I did for the Perl 6
931meta-model. However, Moose is B<NOT> an experiment/prototype; it is for B<real>.
932
933=item Is this ready for use in production?
934
935Yes, I believe that it is.
936
937Moose has been used successfully in production environemnts by several people
938and companies (including the one I work for). There are Moose applications
939which have been in production with little or no issue now for well over two years.
940I consider it highly stable and we are commited to keeping it stable.
941
942Of course, in the end, you need to make this call yourself. If you have
943any questions or concerns, please feel free to email me, or even the list
944or just stop by #moose and ask away.
945
946=item Is Moose just Perl 6 in Perl 5?
947
948No. While Moose is very much inspired by Perl 6, it is not itself Perl 6.
949Instead, it is an OO system for Perl 5. I built Moose because I was tired of
950writing the same old boring Perl 5 OO code, and drooling over Perl 6 OO. So
951instead of switching to Ruby, I wrote Moose :)
952
953=item Wait, I<post> modern, I thought it was just I<modern>?
954
955So I was reading Larry Wall's talk from the 1999 Linux World entitled
956"Perl, the first postmodern computer language" in which he talks about how
957he picked the features for Perl because he thought they were cool and he
958threw out the ones that he thought sucked. This got me thinking about how
959we have done the same thing in Moose. For Moose, we have "borrowed" features
960from Perl 6, CLOS (LISP), Smalltalk, Java, BETA, OCaml, Ruby and more, and
961the bits we didn't like (cause they sucked) we tossed aside. So for this
962reason (and a few others) I have re-dubbed Moose a I<postmodern> object system.
963
964Nuff Said.
965
966=back
967
5569c072 968=head1 ACKNOWLEDGEMENTS
969
970=over 4
971
54c189df 972=item I blame Sam Vilain for introducing me to the insanity that is meta-models.
5569c072 973
54c189df 974=item I blame Audrey Tang for then encouraging my meta-model habit in #perl6.
5569c072 975
26fbace8 976=item Without Yuval "nothingmuch" Kogman this module would not be possible,
54c189df 977and it certainly wouldn't have this name ;P
5569c072 978
26fbace8 979=item The basis of the TypeContraints module was Rob Kinyon's idea
5569c072 980originally, I just ran with it.
981
638585e1 982=item Thanks to mst & chansen and the whole #moose posse for all the
c84f324f 983early ideas/feature-requests/encouragement/bug-finding.
d46a48f3 984
68efb014 985=item Thanks to David "Theory" Wheeler for meta-discussions and spelling fixes.
986
5569c072 987=back
988
e90c03d0 989=head1 SEE ALSO
990
991=over 4
992
c84f324f 993=item L<http://www.iinteractive.com/moose>
994
995This is the official web home of Moose, it contains links to our public SVN repo
26fbace8 996as well as links to a number of talks and articles on Moose and Moose related
997technologies.
c84f324f 998
196064ab 999=item L<Moose::Cookbook> - How to cook a Moose
1000
1001=item The Moose is flying, a tutorial by Randal Schwartz
1002
1003Part 1 - L<http://www.stonehenge.com/merlyn/LinuxMag/col94.html>
1004
1005Part 2 - L<http://www.stonehenge.com/merlyn/LinuxMag/col95.html>
1006
6ba6d68c 1007=item L<Class::MOP> documentation
1008
1009=item The #moose channel on irc.perl.org
1010
e67a0fca 1011=item The Moose mailing list - moose@perl.org
1012
9e0361e1 1013=item Moose stats on ohloh.net - L<http://www.ohloh.net/projects/moose>
c84f324f 1014
12aed9a0 1015=item Several Moose extension modules in the C<MooseX::> namespace.
1016
1017See L<http://search.cpan.org/search?query=MooseX::> for extensions.
28669f89 1018
c84f324f 1019=back
1020
004222dc 1021=head2 Books
1022
1023=over 4
1024
1025=item The Art of the MetaObject Protocol
1026
1027I mention this in the L<Class::MOP> docs too, this book was critical in
1028the development of both modules and is highly recommended.
1029
1030=back
1031
26fbace8 1032=head2 Papers
c84f324f 1033
1034=over 4
e90c03d0 1035
159da176 1036=item L<http://www.cs.utah.edu/plt/publications/oopsla04-gff.pdf>
1037
26fbace8 1038This paper (suggested by lbr on #moose) was what lead to the implementation
1039of the C<super>/C<override> and C<inner>/C<augment> features. If you really
1cd45431 1040want to understand them, I suggest you read this.
159da176 1041
e90c03d0 1042=back
1043
fcd84ca9 1044=head1 BUGS
1045
26fbace8 1046All complex software has bugs lurking in it, and this module is no
fcd84ca9 1047exception. If you find a bug please either email me, or add the bug
1048to cpan-RT.
1049
47b19570 1050=head1 FEATURE REQUESTS
1051
1052We are very strict about what features we add to the Moose core, especially
1053the user-visible features. Instead we have made sure that the underlying
1054meta-system of Moose is as extensible as possible so that you can add your
1055own features easily. That said, occasionally there is a feature needed in the
1056meta-system to support your planned extension, in which case you should
1057either email the mailing list or join us on irc at #moose to discuss.
1058
fcd84ca9 1059=head1 AUTHOR
1060
1061Stevan Little E<lt>stevan@iinteractive.comE<gt>
1062
9af1d28b 1063B<with contributions from:>
db1ab48d 1064
9af1d28b 1065Aankhen
1066
1067Adam (Alias) Kennedy
1068
1069Anders (Debolaz) Nor Berle
1070
5868294f 1071Nathan (kolibre) Gray
1072
9af1d28b 1073Christian (chansen) Hansen
1074
e7f8d0c2 1075Hans Dieter (confound) Pearcey
1076
9af1d28b 1077Eric (ewilhelm) Wilhelm
1078
1079Guillermo (groditi) Roditi
1080
1081Jess (castaway) Robinson
1082
1083Matt (mst) Trout
1084
1085Robert (phaylon) Sedlacek
1086
1087Robert (rlb3) Boone
1088
1089Scott (konobi) McWhirter
1090
f44ae52f 1091Shlomi (rindolf) Fish
1092
9af1d28b 1093Yuval (nothingmuch) Kogman
1094
cbe25729 1095Chris (perigrin) Prather
1096
68b6146c 1097Wallace (wreis) Reis
1098
e46f5cc2 1099Jonathan (jrockway) Rockway
1100
3ccdc84a 1101Piotr (dexter) Roszatycki
1102
26fbace8 1103Sam (mugwump) Vilain
f1917f58 1104
ac211120 1105Shawn (sartak) Moore
1106
9af1d28b 1107... and many other #moose folks
98aae381 1108
fcd84ca9 1109=head1 COPYRIGHT AND LICENSE
1110
778db3ac 1111Copyright 2006-2008 by Infinity Interactive, Inc.
fcd84ca9 1112
1113L<http://www.iinteractive.com>
1114
1115This library is free software; you can redistribute it and/or modify
26fbace8 1116it under the same terms as Perl itself.
fcd84ca9 1117
ddd0ec20 1118=cut