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