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