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