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