fixing some stuff
[gitmo/Moose.git] / lib / Moose.pm
CommitLineData
fcd84ca9 1
2package Moose;
3
4use strict;
5use warnings;
6
1db8ecc7 7our $VERSION = '0.24';
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
68efb014 397Moose's type definition features.
6ba6d68c 398
daea75c9 399=item I<coerce =E<gt> (1|0)>
400
401This will attempt to use coercion with the supplied type constraint to change
68efb014 402the value passed into any accessors or constructors. You B<must> have supplied
daea75c9 403a type constraint in order for this to work. See L<Moose::Cookbook::Recipe5>
1cd45431 404for an example.
daea75c9 405
406=item I<does =E<gt> $role_name>
407
408This will accept the name of a role which the value stored in this attribute
409is expected to have consumed.
410
411=item I<required =E<gt> (1|0)>
412
413This marks the attribute as being required. This means a value must be supplied
1cd45431 414during class construction, and the attribute may never be set to C<undef> with
daea75c9 415an accessor.
416
417=item I<weak_ref =E<gt> (1|0)>
418
68efb014 419This will tell the class to store the value of this attribute as a weakened
420reference. If an attribute is a weakened reference, it B<cannot> also be
421coerced.
daea75c9 422
423=item I<lazy =E<gt> (1|0)>
424
68efb014 425This will tell the class to not create this slot until absolutely necessary.
daea75c9 426If an attribute is marked as lazy it B<must> have a default supplied.
427
9e93dd19 428=item I<auto_deref =E<gt> (1|0)>
429
68efb014 430This tells the accessor whether to automatically dereference the value returned.
1cd45431 431This is only legal if your C<isa> option is either C<ArrayRef> or C<HashRef>.
9e93dd19 432
c1935ade 433=item I<metaclass =E<gt> $metaclass_name>
434
1cd45431 435This tells the class to use a custom attribute metaclass for this particular
436attribute. Custom attribute metaclasses are useful for extending the
437capabilities of the I<has> keyword: they are the simplest way to extend the MOP,
438but they are still a fairly advanced topic and too much to cover here. I will
439try and write a recipe on them soon.
440
441The default behavior here is to just load C<$metaclass_name>; however, we also
442have a way to alias to a shorter name. This will first look to see if
443B<Moose::Meta::Attribute::Custom::$metaclass_name> exists. If it does, Moose
444will then check to see if that has the method C<register_implemenetation>, which
445should return the actual name of the custom attribute metaclass. If there is no
446C<register_implemenetation> method, it will fall back to using
c1935ade 447B<Moose::Meta::Attribute::Custom::$metaclass_name> as the metaclass name.
448
daea75c9 449=item I<trigger =E<gt> $code>
450
1cd45431 451The I<trigger> option is a CODE reference which will be called after the value of
452the attribute is set. The CODE ref will be passed the instance itself, the
daea75c9 453updated value and the attribute meta-object (this is for more advanced fiddling
1cd45431 454and can typically be ignored). You B<cannot> have a trigger on a read-only
455attribute.
daea75c9 456
38e3283b 457=item I<handles =E<gt> ARRAY | HASH | REGEXP | CODE>
2c0cbef7 458
1cd45431 459The I<handles> option provides Moose classes with automated delegation features.
460This is a pretty complex and powerful option. It accepts many different option
461formats, each with its own benefits and drawbacks.
38e3283b 462
1cd45431 463B<NOTE:> This feature is no longer experimental, but it may still have subtle
464bugs lurking in the deeper corners. If you think you have found a bug, you
fd595040 465probably have, so please report it to me right away.
38e3283b 466
1cd45431 467B<NOTE:> The class being delegated to does not need to be a Moose based class,
468which is why this feature is especially useful when wrapping non-Moose classes.
38e3283b 469
1cd45431 470All I<handles> option formats share the following traits:
38e3283b 471
1cd45431 472You cannot override a locally defined method with a delegated method; an
473exception will be thrown if you try. That is to say, if you define C<foo> in
474your class, you cannot override it with a delegated C<foo>. This is almost never
475something you would want to do, and if it is, you should do it by hand and not
476use Moose.
38e3283b 477
1cd45431 478You cannot override any of the methods found in Moose::Object, or the C<BUILD>
479and C<DEMOLISH> methods. These will not throw an exception, but will silently
480move on to the next method in the list. My reasoning for this is that you would
481almost never want to do this, since it usually breaks your class. As with
482overriding locally defined methods, if you do want to do this, you should do it
483manually, not with Moose.
38e3283b 484
485Below is the documentation for each option format:
486
487=over 4
488
489=item C<ARRAY>
490
1cd45431 491This is the most common usage for I<handles>. You basically pass a list of
38e3283b 492method names to be delegated, and Moose will install a delegation method
1cd45431 493for each one.
38e3283b 494
495=item C<HASH>
496
1cd45431 497This is the second most common usage for I<handles>. Instead of a list of
498method names, you pass a HASH ref where each key is the method name you
499want installed locally, and its value is the name of the original method
3dd4490b 500in the class being delegated to.
fd595040 501
1cd45431 502This can be very useful for recursive classes like trees. Here is a
fd595040 503quick example (soon to be expanded into a Moose::Cookbook::Recipe):
38e3283b 504
1cd45431 505 package Tree;
38e3283b 506 use Moose;
507
508 has 'node' => (is => 'rw', isa => 'Any');
509
510 has 'children' => (
511 is => 'ro',
512 isa => 'ArrayRef',
513 default => sub { [] }
514 );
515
516 has 'parent' => (
517 is => 'rw',
518 isa => 'Tree',
519 is_weak_ref => 1,
520 handles => {
521 parent_node => 'node',
522 siblings => 'children',
523 }
524 );
525
1cd45431 526In this example, the Tree package gets C<parent_node> and C<siblings> methods,
527which delegate to the C<node> and C<children> methods (respectively) of the Tree
528instance stored in the C<parent> slot.
38e3283b 529
530=item C<REGEXP>
531
532The regexp option works very similar to the ARRAY option, except that it builds
533the list of methods for you. It starts by collecting all possible methods of the
3dd4490b 534class being delegated to, then filters that list using the regexp supplied here.
38e3283b 535
536B<NOTE:> An I<isa> option is required when using the regexp option format. This
537is so that we can determine (at compile time) the method list from the class.
538Without an I<isa> this is just not possible.
539
540=item C<CODE>
541
1cd45431 542This is the option to use when you really want to do something funky. You should
543only use it if you really know what you are doing, as it involves manual
544metaclass twiddling.
38e3283b 545
1cd45431 546This takes a code reference, which should expect two arguments. The first is the
547attribute meta-object this I<handles> is attached to. The second is the
548metaclass of the class being delegated to. It expects you to return a hash (not
549a HASH ref) of the methods you want mapped.
38e3283b 550
551=back
2c0cbef7 552
6ba6d68c 553=back
554
cd7eeaf5 555=item B<has +$name =E<gt> %options>
556
1cd45431 557This is variation on the normal attibute creator C<has> which allows you to
cd7eeaf5 558clone and extend an attribute from a superclass. Here is a quick example:
559
560 package Foo;
561 use Moose;
562
563 has 'message' => (
564 is => 'rw',
565 isa => 'Str',
566 default => 'Hello, I am a Foo'
567 );
568
569 package My::Foo;
570 use Moose;
571
572 extends 'Foo';
573
574 has '+message' => (default => 'Hello I am My::Foo');
575
1cd45431 576What is happening here is that B<My::Foo> is cloning the C<message> attribute
577from its parent class B<Foo>, retaining the C<is =E<gt> 'rw'> and C<isa =E<gt>
578'Str'> characteristics, but changing the value in C<default>.
cd7eeaf5 579
580This feature is restricted somewhat, so as to try and enfore at least I<some>
581sanity into it. You are only allowed to change the following attributes:
582
583=over 4
584
585=item I<default>
586
587Change the default value of an attribute.
588
589=item I<coerce>
590
591Change whether the attribute attempts to coerce a value passed to it.
592
593=item I<required>
594
595Change if the attribute is required to have a value.
596
597=item I<documentation>
598
599Change the documentation string associated with the attribute.
600
601=item I<isa>
602
1cd45431 603You I<are> allowed to change the type, B<if and only if> the new type is a
604subtype of the old type.
cd7eeaf5 605
606=back
607
076c81ed 608=item B<before $name|@names =E<gt> sub { ... }>
6ba6d68c 609
076c81ed 610=item B<after $name|@names =E<gt> sub { ... }>
6ba6d68c 611
076c81ed 612=item B<around $name|@names =E<gt> sub { ... }>
6ba6d68c 613
d8af92ae 614This three items are syntactic sugar for the before, after, and around method
615modifier features that L<Class::MOP> provides. More information on these may be
616found in the L<Class::MOP::Class documentation|Class::MOP::Class/"Method
617Modifiers"> for now.
6ba6d68c 618
159da176 619=item B<super>
620
68efb014 621The keyword C<super> is a no-op when called outside of an C<override> method. In
159da176 622the context of an C<override> method, it will call the next most appropriate
623superclass method with the same arguments as the original method.
624
625=item B<override ($name, &sub)>
626
68efb014 627An C<override> method is a way of explicitly saying "I am overriding this
159da176 628method from my superclass". You can call C<super> within this method, and
629it will work as expected. The same thing I<can> be accomplished with a normal
68efb014 630method call and the C<SUPER::> pseudo-package; it is really your choice.
159da176 631
632=item B<inner>
633
634The keyword C<inner>, much like C<super>, is a no-op outside of the context of
635an C<augment> method. You can think of C<inner> as being the inverse of
68efb014 636C<super>; the details of how C<inner> and C<augment> work is best described in
159da176 637the L<Moose::Cookbook>.
638
639=item B<augment ($name, &sub)>
640
68efb014 641An C<augment> method, is a way of explicitly saying "I am augmenting this
159da176 642method from my superclass". Once again, the details of how C<inner> and
643C<augment> work is best described in the L<Moose::Cookbook>.
644
6ba6d68c 645=item B<confess>
646
68efb014 647This is the C<Carp::confess> function, and exported here because I use it
6ba6d68c 648all the time. This feature may change in the future, so you have been warned.
649
650=item B<blessed>
651
1cd45431 652This is the C<Scalar::Util::blessed> function, it is exported here because I
6ba6d68c 653use it all the time. It is highly recommended that this is used instead of
654C<ref> anywhere you need to test for an object's class name.
655
656=back
657
1cd45431 658=head1 UNIMPORTING FUNCTIONS
31f8ec72 659
660=head2 B<unimport>
661
1cd45431 662Moose offers a way to remove the keywords it exports, through the C<unimport>
31f8ec72 663method. You simply have to say C<no Moose> at the bottom of your code for this
664to work. Here is an example:
665
666 package Person;
667 use Moose;
668
669 has 'first_name' => (is => 'rw', isa => 'Str');
670 has 'last_name' => (is => 'rw', isa => 'Str');
671
672 sub full_name {
673 my $self = shift;
674 $self->first_name . ' ' . $self->last_name
675 }
676
677 no Moose; # keywords are removed from the Person package
678
2c0cbef7 679=head1 MISC.
680
681=head2 What does Moose stand for??
682
1cd45431 683Moose doesn't stand for one thing in particular. However, if you
68efb014 684want, here are a few of my favorites; feel free to contribute
2c0cbef7 685more :)
686
687=over 4
688
689=item Make Other Object Systems Envious
690
691=item Makes Object Orientation So Easy
692
693=item Makes Object Orientation Spiffy- Er (sorry ingy)
694
695=item Most Other Object Systems Emasculate
696
2c0cbef7 697=item Moose Often Ovulate Sorta Early
698
2c0cbef7 699=item Moose Offers Often Super Extensions
700
701=item Meta Object Orientation Syntax Extensions
702
703=back
704
05d9eaf6 705=head1 CAVEATS
706
707=over 4
708
709=item *
710
1cd45431 711It should be noted that C<super> and C<inner> B<cannot> be used in the same
712method. However, they may be combined within the same class hierarchy; see
713F<t/014_override_augment_inner_super.t> for an example.
05d9eaf6 714
68efb014 715The reason for this is that C<super> is only valid within a method
05d9eaf6 716with the C<override> modifier, and C<inner> will never be valid within an
717C<override> method. In fact, C<augment> will skip over any C<override> methods
68efb014 718when searching for its appropriate C<inner>.
05d9eaf6 719
1cd45431 720This might seem like a restriction, but I am of the opinion that keeping these
721two features separate (yet interoperable) actually makes them easy to use, since
722their behavior is then easier to predict. Time will tell whether I am right or
723not.
05d9eaf6 724
725=back
726
5569c072 727=head1 ACKNOWLEDGEMENTS
728
729=over 4
730
54c189df 731=item I blame Sam Vilain for introducing me to the insanity that is meta-models.
5569c072 732
54c189df 733=item I blame Audrey Tang for then encouraging my meta-model habit in #perl6.
5569c072 734
076c81ed 735=item Without Yuval "nothingmuch" Kogman this module would not be possible,
54c189df 736and it certainly wouldn't have this name ;P
5569c072 737
738=item The basis of the TypeContraints module was Rob Kinyon's idea
739originally, I just ran with it.
740
076c81ed 741=item Thanks to mst & chansen and the whole #moose poose for all the
fd595040 742ideas/feature-requests/encouragement/bug-finding.
d46a48f3 743
68efb014 744=item Thanks to David "Theory" Wheeler for meta-discussions and spelling fixes.
745
5569c072 746=back
747
e90c03d0 748=head1 SEE ALSO
749
750=over 4
751
6ba6d68c 752=item L<Class::MOP> documentation
753
754=item The #moose channel on irc.perl.org
755
e67a0fca 756=item The Moose mailing list - moose@perl.org
757
e90c03d0 758=item L<http://forum2.org/moose/>
759
159da176 760=item L<http://www.cs.utah.edu/plt/publications/oopsla04-gff.pdf>
761
762This paper (suggested by lbr on #moose) was what lead to the implementation
1cd45431 763of the C<super>/C<override> and C<inner>/C<augment> features. If you really
764want to understand them, I suggest you read this.
159da176 765
e90c03d0 766=back
767
fcd84ca9 768=head1 BUGS
769
770All complex software has bugs lurking in it, and this module is no
771exception. If you find a bug please either email me, or add the bug
772to cpan-RT.
773
fcd84ca9 774=head1 AUTHOR
775
776Stevan Little E<lt>stevan@iinteractive.comE<gt>
777
9af1d28b 778B<with contributions from:>
db1ab48d 779
9af1d28b 780Aankhen
781
782Adam (Alias) Kennedy
783
784Anders (Debolaz) Nor Berle
785
786Christian (chansen) Hansen
787
788Eric (ewilhelm) Wilhelm
789
790Guillermo (groditi) Roditi
791
792Jess (castaway) Robinson
793
794Matt (mst) Trout
795
796Robert (phaylon) Sedlacek
797
798Robert (rlb3) Boone
799
800Scott (konobi) McWhirter
801
802Yuval (nothingmuch) Kogman
803
cbe25729 804Chris (perigrin) Prather
805
9af1d28b 806... and many other #moose folks
98aae381 807
fcd84ca9 808=head1 COPYRIGHT AND LICENSE
809
b77fdbed 810Copyright 2006, 2007 by Infinity Interactive, Inc.
fcd84ca9 811
812L<http://www.iinteractive.com>
813
814This library is free software; you can redistribute it and/or modify
815it under the same terms as Perl itself.
816
ddd0ec20 817=cut