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