massive refactoring begun for Moose::Meta::Role
[gitmo/Moose.git] / lib / Moose.pm
CommitLineData
fcd84ca9 1
2package Moose;
3
4use strict;
5use warnings;
6
f44ae52f 7our $VERSION = '0.25';
d44714be 8our $AUTHORITY = 'cpan:STEVAN';
fcd84ca9 9
cc65ead0 10use Scalar::Util 'blessed', 'reftype';
fcd84ca9 11use Carp 'confess';
bc1e29b5 12use Sub::Name 'subname';
31f8ec72 13use B 'svref_2object';
fcd84ca9 14
2d562421 15use Sub::Exporter;
7f18097c 16
a8878950 17use Class::MOP 0.39;
ef1d5f4b 18
c0e30cf5 19use Moose::Meta::Class;
7415b2cb 20use Moose::Meta::TypeConstraint;
7c13858b 21use Moose::Meta::TypeCoercion;
78cd1d3b 22use Moose::Meta::Attribute;
ddd0ec20 23use Moose::Meta::Instance;
c0e30cf5 24
fcd84ca9 25use Moose::Object;
7415b2cb 26use Moose::Util::TypeConstraints;
a15dff8d 27
a3c7e2fe 28{
be33e4f3 29 my $CALLER;
a3c7e2fe 30
be33e4f3 31 sub _init_meta {
a3c7e2fe 32 my $class = $CALLER;
33
a3c7e2fe 34 # make a subtype for each Moose class
35 subtype $class
36 => as 'Object'
37 => where { $_->isa($class) }
8ecb1fa0 38 => optimize_as { blessed($_[0]) && $_[0]->isa($class) }
a3c7e2fe 39 unless find_type_constraint($class);
40
41 my $meta;
42 if ($class->can('meta')) {
fcec2383 43 # NOTE:
44 # this is the case where the metaclass pragma
45 # was used before the 'use Moose' statement to
46 # override a specific class
a3c7e2fe 47 $meta = $class->meta();
48 (blessed($meta) && $meta->isa('Moose::Meta::Class'))
66bcefc1 49 || confess "You already have a &meta function, but it does not return a Moose::Meta::Class";
a3c7e2fe 50 }
51 else {
fcec2383 52 # NOTE:
53 # this is broken currently, we actually need
54 # to allow the possiblity of an inherited
55 # meta, which will not be visible until the
56 # user 'extends' first. This needs to have
57 # more intelligence to it
590868a3 58 $meta = Moose::Meta::Class->initialize($class);
a3c7e2fe 59 $meta->add_method('meta' => sub {
60 # re-initialize so it inherits properly
fcb7afc2 61 Moose::Meta::Class->initialize(blessed($_[0]) || $_[0]);
a3c7e2fe 62 })
63 }
64
65 # make sure they inherit from Moose::Object
66 $meta->superclasses('Moose::Object')
67 unless $meta->superclasses();
a3c7e2fe 68 }
69
70 my %exports = (
71 extends => sub {
be33e4f3 72 my $class = $CALLER;
68117c45 73 return subname 'Moose::extends' => sub (@) {
74 confess "Must derive at least one class" unless @_;
1eaed09d 75 Class::MOP::load_class($_) for @_;
1341f10c 76 # this checks the metaclass to make sure
77 # it is correct, sometimes it can get out
78 # of sync when the classes are being built
79 my $meta = $class->meta->_fix_metaclass_incompatability(@_);
be33e4f3 80 $meta->superclasses(@_);
a3c7e2fe 81 };
82 },
83 with => sub {
be33e4f3 84 my $class = $CALLER;
68117c45 85 return subname 'Moose::with' => sub (@) {
db1ab48d 86 my (@roles) = @_;
68117c45 87 confess "Must specify at least one role" unless @roles;
1eaed09d 88 Class::MOP::load_class($_) for @roles;
1341f10c 89 $class->meta->_apply_all_roles(@roles);
a3c7e2fe 90 };
91 },
92 has => sub {
be33e4f3 93 my $class = $CALLER;
2c0cbef7 94 return subname 'Moose::has' => sub ($;%) {
f6e5456f 95 my ($name, %options) = @_;
96 my $attrs = (ref($name) eq 'ARRAY') ? $name : [($name)];
97 $class->meta->_process_attribute($_, %options) for @$attrs;
a3c7e2fe 98 };
99 },
100 before => sub {
be33e4f3 101 my $class = $CALLER;
2c0cbef7 102 return subname 'Moose::before' => sub (@&) {
a3c7e2fe 103 my $code = pop @_;
be33e4f3 104 my $meta = $class->meta;
a3c7e2fe 105 $meta->add_before_method_modifier($_, $code) for @_;
106 };
107 },
108 after => sub {
be33e4f3 109 my $class = $CALLER;
2c0cbef7 110 return subname 'Moose::after' => sub (@&) {
a3c7e2fe 111 my $code = pop @_;
be33e4f3 112 my $meta = $class->meta;
a3c7e2fe 113 $meta->add_after_method_modifier($_, $code) for @_;
114 };
115 },
116 around => sub {
be33e4f3 117 my $class = $CALLER;
2c0cbef7 118 return subname 'Moose::around' => sub (@&) {
a3c7e2fe 119 my $code = pop @_;
be33e4f3 120 my $meta = $class->meta;
a3c7e2fe 121 $meta->add_around_method_modifier($_, $code) for @_;
122 };
123 },
124 super => sub {
52c7c330 125 {
126 our %SUPER_SLOT;
127 no strict 'refs';
128 $SUPER_SLOT{$CALLER} = \*{"${CALLER}::super"};
129 }
3d544ed5 130 return subname 'Moose::super' => sub {};
a3c7e2fe 131 },
132 override => sub {
be33e4f3 133 my $class = $CALLER;
2c0cbef7 134 return subname 'Moose::override' => sub ($&) {
a3c7e2fe 135 my ($name, $method) = @_;
be33e4f3 136 $class->meta->add_override_method_modifier($name => $method);
a3c7e2fe 137 };
138 },
139 inner => sub {
52c7c330 140 {
141 our %INNER_SLOT;
142 no strict 'refs';
143 $INNER_SLOT{$CALLER} = \*{"${CALLER}::inner"};
144 }
3d544ed5 145 return subname 'Moose::inner' => sub {};
a3c7e2fe 146 },
147 augment => sub {
be33e4f3 148 my $class = $CALLER;
2c0cbef7 149 return subname 'Moose::augment' => sub (@&) {
a3c7e2fe 150 my ($name, $method) = @_;
be33e4f3 151 $class->meta->add_augment_method_modifier($name => $method);
a3c7e2fe 152 };
153 },
3279ab4a 154
68efb014 155 # NOTE:
2a0f3bd3 156 # this is experimental, but I am not
157 # happy with it. If you want to try
158 # it, you will have to uncomment it
159 # yourself.
160 # There is a really good chance that
161 # this will be deprecated, dont get
162 # too attached
163 # self => sub {
164 # return subname 'Moose::self' => sub {};
165 # },
166 # method => sub {
167 # my $class = $CALLER;
168 # return subname 'Moose::method' => sub {
169 # my ($name, $method) = @_;
170 # $class->meta->add_method($name, sub {
171 # my $self = shift;
172 # no strict 'refs';
173 # no warnings 'redefine';
174 # local *{$class->meta->name . '::self'} = sub { $self };
175 # $method->(@_);
176 # });
177 # };
178 # },
3279ab4a 179
a3c7e2fe 180 confess => sub {
181 return \&Carp::confess;
182 },
183 blessed => sub {
184 return \&Scalar::Util::blessed;
66bcefc1 185 },
a3c7e2fe 186 );
3d544ed5 187
a3c7e2fe 188 my $exporter = Sub::Exporter::build_exporter({
189 exports => \%exports,
190 groups => {
191 default => [':all']
192 }
193 });
194
fcb7afc2 195 sub import {
a3c7e2fe 196 $CALLER = caller();
c235cd98 197
198 strict->import;
199 warnings->import;
a3c7e2fe 200
201 # we should never export to main
202 return if $CALLER eq 'main';
be33e4f3 203
204 _init_meta();
9eacbf7c 205
a3c7e2fe 206 goto $exporter;
fcb7afc2 207 }
31f8ec72 208
209 sub unimport {
210 no strict 'refs';
211 my $class = caller();
212 # loop through the exports ...
213 foreach my $name (keys %exports) {
214
215 # if we find one ...
216 if (defined &{$class . '::' . $name}) {
217 my $keyword = \&{$class . '::' . $name};
218
219 # make sure it is from Moose
220 my $pkg_name = eval { svref_2object($keyword)->GV->STASH->NAME };
221 next if $@;
222 next if $pkg_name ne 'Moose';
223
224 # and if it is from Moose then undef the slot
225 delete ${$class . '::'}{$name};
226 }
227 }
228 }
5cf3dbcf 229
230
fcd84ca9 231}
232
8ecb1fa0 233## make 'em all immutable
234
235$_->meta->make_immutable(
236 inline_constructor => 0,
237 inline_accessors => 0,
238) for (
239 'Moose::Meta::Attribute',
240 'Moose::Meta::Class',
241 'Moose::Meta::Instance',
242
243 'Moose::Meta::TypeConstraint',
244 'Moose::Meta::TypeConstraint::Union',
245 'Moose::Meta::TypeCoercion',
246
247 'Moose::Meta::Method',
248 'Moose::Meta::Method::Accessor',
249 'Moose::Meta::Method::Constructor',
250 'Moose::Meta::Method::Overriden',
251);
252
fcd84ca9 2531;
254
255__END__
256
257=pod
258
259=head1 NAME
260
31f8ec72 261Moose - A complete modern object system for Perl 5
fcd84ca9 262
263=head1 SYNOPSIS
e522431d 264
265 package Point;
1cd45431 266 use Moose; # automatically turns on strict and warnings
e522431d 267
43d599e5 268 has 'x' => (is => 'rw', isa => 'Int');
269 has 'y' => (is => 'rw', isa => 'Int');
e522431d 270
271 sub clear {
272 my $self = shift;
273 $self->x(0);
274 $self->y(0);
275 }
276
277 package Point3D;
278 use Moose;
279
280 extends 'Point';
09fdc1dc 281
43d599e5 282 has 'z' => (is => 'rw', isa => 'Int');
e522431d 283
284 after 'clear' => sub {
285 my $self = shift;
43d599e5 286 $self->z(0);
734d1752 287 };
2c0cbef7 288
fcd84ca9 289=head1 DESCRIPTION
290
e522431d 291Moose is an extension of the Perl 5 object system.
292
293=head2 Another object system!?!?
fcd84ca9 294
e522431d 295Yes, I know there has been an explosion recently of new ways to
68efb014 296build object's in Perl 5, most of them based on inside-out objects
e522431d 297and other such things. Moose is different because it is not a new
298object system for Perl 5, but instead an extension of the existing
299object system.
3c7278fb 300
e522431d 301Moose is built on top of L<Class::MOP>, which is a metaclass system
302for Perl 5. This means that Moose not only makes building normal
505c6fac 303Perl 5 objects better, but it also provides the power of metaclass
304programming.
e522431d 305
734d1752 306=head2 Is this for real? Or is this just an experiment?
e522431d 307
2c0cbef7 308Moose is I<based> on the prototypes and experiments I did for the Perl 6
1cd45431 309meta-model. However, Moose is B<NOT> an experiment/prototype; it is for B<real>.
734d1752 310
d44714be 311=head2 Is this ready for use in production?
312
313Yes, I believe that it is.
734d1752 314
315I have two medium-to-large-ish web applications which use Moose heavily
316and have been in production (without issue) for several months now. At
317$work, we are re-writing our core offering in it. And several people on
318#moose have been using it (in production) for several months now as well.
e522431d 319
d44714be 320Of course, in the end, you need to make this call yourself. If you have
321any questions or concerns, please feel free to email me, or even the list
322or just stop by #moose and ask away.
323
43d599e5 324=head2 Is Moose just Perl 6 in Perl 5?
e522431d 325
68efb014 326No. While Moose is very much inspired by Perl 6, it is not itself Perl 6.
1cd45431 327Instead, it is an OO system for Perl 5. I built Moose because I was tired of
68efb014 328writing the same old boring Perl 5 OO code, and drooling over Perl 6 OO. So
329instead of switching to Ruby, I wrote Moose :)
3c7278fb 330
6ba6d68c 331=head1 BUILDING CLASSES WITH MOOSE
332
68efb014 333Moose makes every attempt to provide as much convenience as possible during
334class construction/definition, but still stay out of your way if you want it
335to. Here are a few items to note when building classes with Moose.
6ba6d68c 336
337Unless specified with C<extends>, any class which uses Moose will
338inherit from L<Moose::Object>.
339
1cd45431 340Moose will also manage all attributes (including inherited ones) that are
341defined with C<has>. And (assuming you call C<new>, which is inherited from
342L<Moose::Object>) this includes properly initializing all instance slots,
343setting defaults where appropriate, and performing any type constraint checking
344or coercion.
6ba6d68c 345
346=head1 EXPORTED FUNCTIONS
347
68efb014 348Moose will export a number of functions into the class's namespace which
1cd45431 349may then be used to set up the class. These functions all work directly
6ba6d68c 350on the current class.
351
352=over 4
353
354=item B<meta>
355
356This is a method which provides access to the current class's metaclass.
357
358=item B<extends (@superclasses)>
359
360This function will set the superclass(es) for the current class.
361
362This approach is recommended instead of C<use base>, because C<use base>
363actually C<push>es onto the class's C<@ISA>, whereas C<extends> will
364replace it. This is important to ensure that classes which do not have
68efb014 365superclasses still properly inherit from L<Moose::Object>.
6ba6d68c 366
43d599e5 367=item B<with (@roles)>
e9ec68d6 368
43d599e5 369This will apply a given set of C<@roles> to the local class. Role support
68efb014 370is currently under heavy development; see L<Moose::Role> for more details.
e9ec68d6 371
cd7eeaf5 372=item B<has $name =E<gt> %options>
6ba6d68c 373
374This will install an attribute of a given C<$name> into the current class.
1cd45431 375The C<%options> are the same as those provided by
43d599e5 376L<Class::MOP::Attribute>, in addition to the list below which are provided
377by Moose (L<Moose::Meta::Attribute> to be more specific):
6ba6d68c 378
379=over 4
380
076c81ed 381=item I<is =E<gt> 'rw'|'ro'>
6ba6d68c 382
383The I<is> option accepts either I<rw> (for read/write) or I<ro> (for read
384only). These will create either a read/write accessor or a read-only
385accessor respectively, using the same name as the C<$name> of the attribute.
386
1cd45431 387If you need more control over how your accessors are named, you can use the
388I<reader>, I<writer> and I<accessor> options inherited from
389L<Class::MOP::Attribute>.
6ba6d68c 390
076c81ed 391=item I<isa =E<gt> $type_name>
6ba6d68c 392
393The I<isa> option uses Moose's type constraint facilities to set up runtime
394type checking for this attribute. Moose will perform the checks during class
395construction, and within any accessors. The C<$type_name> argument must be a
1cd45431 396string. The string may be either a class name or a type defined using
9cca2e9e 397Moose's type definition features. (Refer to L<Moose::Util::TypeConstraints>
398for information on how to define a new type).
6ba6d68c 399
daea75c9 400=item I<coerce =E<gt> (1|0)>
401
402This will attempt to use coercion with the supplied type constraint to change
68efb014 403the value passed into any accessors or constructors. You B<must> have supplied
daea75c9 404a type constraint in order for this to work. See L<Moose::Cookbook::Recipe5>
1cd45431 405for an example.
daea75c9 406
407=item I<does =E<gt> $role_name>
408
409This will accept the name of a role which the value stored in this attribute
410is expected to have consumed.
411
412=item I<required =E<gt> (1|0)>
413
414This marks the attribute as being required. This means a value must be supplied
1cd45431 415during class construction, and the attribute may never be set to C<undef> with
daea75c9 416an accessor.
417
418=item I<weak_ref =E<gt> (1|0)>
419
68efb014 420This will tell the class to store the value of this attribute as a weakened
421reference. If an attribute is a weakened reference, it B<cannot> also be
422coerced.
daea75c9 423
424=item I<lazy =E<gt> (1|0)>
425
68efb014 426This will tell the class to not create this slot until absolutely necessary.
daea75c9 427If an attribute is marked as lazy it B<must> have a default supplied.
428
9e93dd19 429=item I<auto_deref =E<gt> (1|0)>
430
68efb014 431This tells the accessor whether to automatically dereference the value returned.
1cd45431 432This is only legal if your C<isa> option is either C<ArrayRef> or C<HashRef>.
9e93dd19 433
c1935ade 434=item I<metaclass =E<gt> $metaclass_name>
435
1cd45431 436This tells the class to use a custom attribute metaclass for this particular
437attribute. Custom attribute metaclasses are useful for extending the
438capabilities of the I<has> keyword: they are the simplest way to extend the MOP,
439but they are still a fairly advanced topic and too much to cover here. I will
440try and write a recipe on them soon.
441
442The default behavior here is to just load C<$metaclass_name>; however, we also
443have a way to alias to a shorter name. This will first look to see if
444B<Moose::Meta::Attribute::Custom::$metaclass_name> exists. If it does, Moose
445will then check to see if that has the method C<register_implemenetation>, which
446should return the actual name of the custom attribute metaclass. If there is no
447C<register_implemenetation> method, it will fall back to using
c1935ade 448B<Moose::Meta::Attribute::Custom::$metaclass_name> as the metaclass name.
449
daea75c9 450=item I<trigger =E<gt> $code>
451
1cd45431 452The I<trigger> option is a CODE reference which will be called after the value of
453the attribute is set. The CODE ref will be passed the instance itself, the
daea75c9 454updated value and the attribute meta-object (this is for more advanced fiddling
1cd45431 455and can typically be ignored). You B<cannot> have a trigger on a read-only
456attribute.
daea75c9 457
c84f324f 458=item I<handles =E<gt> ARRAY | HASH | REGEXP | ROLE | CODE>
2c0cbef7 459
1cd45431 460The I<handles> option provides Moose classes with automated delegation features.
461This is a pretty complex and powerful option. It accepts many different option
462formats, each with its own benefits and drawbacks.
38e3283b 463
1cd45431 464B<NOTE:> This feature is no longer experimental, but it may still have subtle
465bugs lurking in the deeper corners. If you think you have found a bug, you
fd595040 466probably have, so please report it to me right away.
38e3283b 467
1cd45431 468B<NOTE:> The class being delegated to does not need to be a Moose based class,
469which is why this feature is especially useful when wrapping non-Moose classes.
38e3283b 470
1cd45431 471All I<handles> option formats share the following traits:
38e3283b 472
1cd45431 473You cannot override a locally defined method with a delegated method; an
474exception will be thrown if you try. That is to say, if you define C<foo> in
475your class, you cannot override it with a delegated C<foo>. This is almost never
476something you would want to do, and if it is, you should do it by hand and not
477use Moose.
38e3283b 478
1cd45431 479You cannot override any of the methods found in Moose::Object, or the C<BUILD>
480and C<DEMOLISH> methods. These will not throw an exception, but will silently
481move on to the next method in the list. My reasoning for this is that you would
482almost never want to do this, since it usually breaks your class. As with
483overriding locally defined methods, if you do want to do this, you should do it
484manually, not with Moose.
38e3283b 485
486Below is the documentation for each option format:
487
488=over 4
489
490=item C<ARRAY>
491
1cd45431 492This is the most common usage for I<handles>. You basically pass a list of
38e3283b 493method names to be delegated, and Moose will install a delegation method
1cd45431 494for each one.
38e3283b 495
496=item C<HASH>
497
1cd45431 498This is the second most common usage for I<handles>. Instead of a list of
499method names, you pass a HASH ref where each key is the method name you
500want installed locally, and its value is the name of the original method
3dd4490b 501in the class being delegated to.
fd595040 502
1cd45431 503This can be very useful for recursive classes like trees. Here is a
fd595040 504quick example (soon to be expanded into a Moose::Cookbook::Recipe):
38e3283b 505
1cd45431 506 package Tree;
38e3283b 507 use Moose;
508
509 has 'node' => (is => 'rw', isa => 'Any');
510
511 has 'children' => (
512 is => 'ro',
513 isa => 'ArrayRef',
514 default => sub { [] }
515 );
516
517 has 'parent' => (
518 is => 'rw',
519 isa => 'Tree',
520 is_weak_ref => 1,
521 handles => {
522 parent_node => 'node',
523 siblings => 'children',
524 }
525 );
526
1cd45431 527In this example, the Tree package gets C<parent_node> and C<siblings> methods,
528which delegate to the C<node> and C<children> methods (respectively) of the Tree
529instance stored in the C<parent> slot.
38e3283b 530
531=item C<REGEXP>
532
533The regexp option works very similar to the ARRAY option, except that it builds
534the list of methods for you. It starts by collecting all possible methods of the
3dd4490b 535class being delegated to, then filters that list using the regexp supplied here.
38e3283b 536
537B<NOTE:> An I<isa> option is required when using the regexp option format. This
538is so that we can determine (at compile time) the method list from the class.
539Without an I<isa> this is just not possible.
540
c84f324f 541=item C<ROLE>
542
543With the role option, you specify the name of a role whose "interface" then
544becomes the list of methods to handle. The "interface" can be defined as; the
545methods of the role and any required methods of the role. It should be noted
546that this does B<not> include any method modifiers or generated attribute
547methods (which is consistent with role composition).
548
38e3283b 549=item C<CODE>
550
1cd45431 551This is the option to use when you really want to do something funky. You should
552only use it if you really know what you are doing, as it involves manual
553metaclass twiddling.
38e3283b 554
1cd45431 555This takes a code reference, which should expect two arguments. The first is the
556attribute meta-object this I<handles> is attached to. The second is the
557metaclass of the class being delegated to. It expects you to return a hash (not
558a HASH ref) of the methods you want mapped.
38e3283b 559
560=back
2c0cbef7 561
6ba6d68c 562=back
563
cd7eeaf5 564=item B<has +$name =E<gt> %options>
565
1cd45431 566This is variation on the normal attibute creator C<has> which allows you to
cd7eeaf5 567clone and extend an attribute from a superclass. Here is a quick example:
568
569 package Foo;
570 use Moose;
571
572 has 'message' => (
573 is => 'rw',
574 isa => 'Str',
575 default => 'Hello, I am a Foo'
576 );
577
578 package My::Foo;
579 use Moose;
580
581 extends 'Foo';
582
583 has '+message' => (default => 'Hello I am My::Foo');
584
1cd45431 585What is happening here is that B<My::Foo> is cloning the C<message> attribute
586from its parent class B<Foo>, retaining the C<is =E<gt> 'rw'> and C<isa =E<gt>
587'Str'> characteristics, but changing the value in C<default>.
cd7eeaf5 588
83cc9094 589This feature is restricted somewhat, so as to try and force at least I<some>
cd7eeaf5 590sanity into it. You are only allowed to change the following attributes:
591
592=over 4
593
594=item I<default>
595
596Change the default value of an attribute.
597
598=item I<coerce>
599
600Change whether the attribute attempts to coerce a value passed to it.
601
602=item I<required>
603
604Change if the attribute is required to have a value.
605
606=item I<documentation>
607
608Change the documentation string associated with the attribute.
609
83cc9094 610=item I<lazy>
611
612Change if the attribute lazily initializes the slot.
613
cd7eeaf5 614=item I<isa>
615
1cd45431 616You I<are> allowed to change the type, B<if and only if> the new type is a
617subtype of the old type.
cd7eeaf5 618
83cc9094 619=item I<handles>
620
621You are allowed to B<add> a new C<handles> definition, but you are B<not>
622allowed to I<change> one.
623
cd7eeaf5 624=back
625
076c81ed 626=item B<before $name|@names =E<gt> sub { ... }>
6ba6d68c 627
076c81ed 628=item B<after $name|@names =E<gt> sub { ... }>
6ba6d68c 629
076c81ed 630=item B<around $name|@names =E<gt> sub { ... }>
6ba6d68c 631
d8af92ae 632This three items are syntactic sugar for the before, after, and around method
633modifier features that L<Class::MOP> provides. More information on these may be
634found in the L<Class::MOP::Class documentation|Class::MOP::Class/"Method
635Modifiers"> for now.
6ba6d68c 636
159da176 637=item B<super>
638
68efb014 639The keyword C<super> is a no-op when called outside of an C<override> method. In
159da176 640the context of an C<override> method, it will call the next most appropriate
641superclass method with the same arguments as the original method.
642
643=item B<override ($name, &sub)>
644
68efb014 645An C<override> method is a way of explicitly saying "I am overriding this
159da176 646method from my superclass". You can call C<super> within this method, and
647it will work as expected. The same thing I<can> be accomplished with a normal
68efb014 648method call and the C<SUPER::> pseudo-package; it is really your choice.
159da176 649
650=item B<inner>
651
652The keyword C<inner>, much like C<super>, is a no-op outside of the context of
653an C<augment> method. You can think of C<inner> as being the inverse of
68efb014 654C<super>; the details of how C<inner> and C<augment> work is best described in
159da176 655the L<Moose::Cookbook>.
656
657=item B<augment ($name, &sub)>
658
68efb014 659An C<augment> method, is a way of explicitly saying "I am augmenting this
159da176 660method from my superclass". Once again, the details of how C<inner> and
661C<augment> work is best described in the L<Moose::Cookbook>.
662
6ba6d68c 663=item B<confess>
664
68efb014 665This is the C<Carp::confess> function, and exported here because I use it
6ba6d68c 666all the time. This feature may change in the future, so you have been warned.
667
668=item B<blessed>
669
1cd45431 670This is the C<Scalar::Util::blessed> function, it is exported here because I
6ba6d68c 671use it all the time. It is highly recommended that this is used instead of
672C<ref> anywhere you need to test for an object's class name.
673
674=back
675
1cd45431 676=head1 UNIMPORTING FUNCTIONS
31f8ec72 677
678=head2 B<unimport>
679
1cd45431 680Moose offers a way to remove the keywords it exports, through the C<unimport>
31f8ec72 681method. You simply have to say C<no Moose> at the bottom of your code for this
682to work. Here is an example:
683
684 package Person;
685 use Moose;
686
687 has 'first_name' => (is => 'rw', isa => 'Str');
688 has 'last_name' => (is => 'rw', isa => 'Str');
689
690 sub full_name {
691 my $self = shift;
692 $self->first_name . ' ' . $self->last_name
693 }
694
695 no Moose; # keywords are removed from the Person package
696
05d9eaf6 697=head1 CAVEATS
698
699=over 4
700
701=item *
702
1cd45431 703It should be noted that C<super> and C<inner> B<cannot> be used in the same
704method. However, they may be combined within the same class hierarchy; see
705F<t/014_override_augment_inner_super.t> for an example.
05d9eaf6 706
68efb014 707The reason for this is that C<super> is only valid within a method
05d9eaf6 708with the C<override> modifier, and C<inner> will never be valid within an
709C<override> method. In fact, C<augment> will skip over any C<override> methods
68efb014 710when searching for its appropriate C<inner>.
05d9eaf6 711
1cd45431 712This might seem like a restriction, but I am of the opinion that keeping these
713two features separate (yet interoperable) actually makes them easy to use, since
714their behavior is then easier to predict. Time will tell whether I am right or
c84f324f 715not (UPDATE: so far so good).
05d9eaf6 716
717=back
718
5569c072 719=head1 ACKNOWLEDGEMENTS
720
721=over 4
722
54c189df 723=item I blame Sam Vilain for introducing me to the insanity that is meta-models.
5569c072 724
54c189df 725=item I blame Audrey Tang for then encouraging my meta-model habit in #perl6.
5569c072 726
076c81ed 727=item Without Yuval "nothingmuch" Kogman this module would not be possible,
54c189df 728and it certainly wouldn't have this name ;P
5569c072 729
730=item The basis of the TypeContraints module was Rob Kinyon's idea
731originally, I just ran with it.
732
076c81ed 733=item Thanks to mst & chansen and the whole #moose poose for all the
c84f324f 734early ideas/feature-requests/encouragement/bug-finding.
d46a48f3 735
68efb014 736=item Thanks to David "Theory" Wheeler for meta-discussions and spelling fixes.
737
5569c072 738=back
739
e90c03d0 740=head1 SEE ALSO
741
742=over 4
743
c84f324f 744=item L<http://www.iinteractive.com/moose>
745
746This is the official web home of Moose, it contains links to our public SVN repo
747as well as links to a number of talks and articles on Moose and Moose related
748technologies.
749
6ba6d68c 750=item L<Class::MOP> documentation
751
752=item The #moose channel on irc.perl.org
753
e67a0fca 754=item The Moose mailing list - moose@perl.org
755
c84f324f 756=item Moose stats on ohloh.net - L<http://www.ohloh.net/projects/5788>
757
758=back
759
760=head2 Papers
761
762=over 4
e90c03d0 763
159da176 764=item L<http://www.cs.utah.edu/plt/publications/oopsla04-gff.pdf>
765
766This paper (suggested by lbr on #moose) was what lead to the implementation
1cd45431 767of the C<super>/C<override> and C<inner>/C<augment> features. If you really
768want to understand them, I suggest you read this.
159da176 769
e90c03d0 770=back
771
fcd84ca9 772=head1 BUGS
773
774All complex software has bugs lurking in it, and this module is no
775exception. If you find a bug please either email me, or add the bug
776to cpan-RT.
777
fcd84ca9 778=head1 AUTHOR
779
780Stevan Little E<lt>stevan@iinteractive.comE<gt>
781
9af1d28b 782B<with contributions from:>
db1ab48d 783
9af1d28b 784Aankhen
785
786Adam (Alias) Kennedy
787
788Anders (Debolaz) Nor Berle
789
790Christian (chansen) Hansen
791
792Eric (ewilhelm) Wilhelm
793
794Guillermo (groditi) Roditi
795
796Jess (castaway) Robinson
797
798Matt (mst) Trout
799
800Robert (phaylon) Sedlacek
801
802Robert (rlb3) Boone
803
804Scott (konobi) McWhirter
805
f44ae52f 806Shlomi (rindolf) Fish
807
9af1d28b 808Yuval (nothingmuch) Kogman
809
cbe25729 810Chris (perigrin) Prather
811
9af1d28b 812... and many other #moose folks
98aae381 813
fcd84ca9 814=head1 COPYRIGHT AND LICENSE
815
b77fdbed 816Copyright 2006, 2007 by Infinity Interactive, Inc.
fcd84ca9 817
818L<http://www.iinteractive.com>
819
820This library is free software; you can redistribute it and/or modify
821it under the same terms as Perl itself.
822
ddd0ec20 823=cut