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