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