3ea4fbdb9036cc42230b51bb858a92cd13532bfa
[gitmo/Class-MOP.git] / lib / Class / MOP.pm
1
2 package Class::MOP;
3
4 use strict;
5 use warnings;
6
7 use 5.008;
8
9 use MRO::Compat;
10
11 use Carp          'confess';
12 use Scalar::Util  'weaken', 'reftype', 'blessed';
13
14 use Class::MOP::Class;
15 use Class::MOP::Attribute;
16 use Class::MOP::Method;
17
18 BEGIN {
19     *IS_RUNNING_ON_5_10 = ($] < 5.009_005)
20         ? sub () { 0 }
21         : sub () { 1 };
22
23     # this is either part of core or set up appropriately by MRO::Compat
24     *check_package_cache_flag = \&mro::get_pkg_gen;
25 }
26
27 our $VERSION   = '0.92_01';
28 our $XS_VERSION = $VERSION;
29 $VERSION = eval $VERSION;
30 our $AUTHORITY = 'cpan:STEVAN';
31
32 require XSLoader;
33 XSLoader::load( __PACKAGE__, $XS_VERSION );
34
35
36 {
37     # Metaclasses are singletons, so we cache them here.
38     # there is no need to worry about destruction though
39     # because they should die only when the program dies.
40     # After all, do package definitions even get reaped?
41     # Anonymous classes manage their own destruction.
42     my %METAS;
43
44     sub get_all_metaclasses         {        %METAS         }
45     sub get_all_metaclass_instances { values %METAS         }
46     sub get_all_metaclass_names     { keys   %METAS         }
47     sub get_metaclass_by_name       { $METAS{$_[0]}         }
48     sub store_metaclass_by_name     { $METAS{$_[0]} = $_[1] }
49     sub weaken_metaclass            { weaken($METAS{$_[0]}) }
50     sub does_metaclass_exist        { exists $METAS{$_[0]} && defined $METAS{$_[0]} }
51     sub remove_metaclass_by_name    { delete $METAS{$_[0]}; return }
52
53     # This handles instances as well as class names
54     sub class_of {
55         return unless defined $_[0];
56         my $class = blessed($_[0]) || $_[0];
57         return $METAS{$class};
58     }
59
60     # NOTE:
61     # We only cache metaclasses, meaning instances of
62     # Class::MOP::Class. We do not cache instance of
63     # Class::MOP::Package or Class::MOP::Module. Mostly
64     # because I don't yet see a good reason to do so.
65 }
66
67 sub _class_to_pmfile {
68     my $class = shift;
69
70     my $file = $class . '.pm';
71     $file =~ s{::}{/}g;
72
73     return $file;
74 }
75
76 sub load_first_existing_class {
77     my @classes = @_
78         or return;
79
80     foreach my $class (@classes) {
81         unless ( _is_valid_class_name($class) ) {
82             my $display = defined($class) ? $class : 'undef';
83             confess "Invalid class name ($display)";
84         }
85     }
86
87     my $found;
88     my %exceptions;
89     for my $class (@classes) {
90         my $e = _try_load_one_class($class);
91
92         if ($e) {
93             my $pmfile = _class_to_pmfile($class);
94             $exceptions{$class} = $e;
95             last if $e !~ /^Can't locate \Q$pmfile\E in \@INC/;
96         }
97         else {
98             $found = $class;
99             last;
100         }
101     }
102
103     return $found if $found;
104
105     confess join(
106         "\n",
107         map {
108             sprintf(
109                 "Could not load class (%s) because : %s", $_,
110                 $exceptions{$_}
111                 )
112             }
113         grep {
114             exists $exceptions{$_}
115             } @classes
116     );
117 }
118
119 sub _try_load_one_class {
120     my $class = shift;
121
122     return if is_class_loaded($class);
123
124     my $file = _class_to_pmfile($class);
125
126     return do {
127         local $@;
128         local $SIG{__DIE__};
129         eval { require($file) };
130         $@;
131     };
132 }
133
134 sub load_class {
135     load_first_existing_class($_[0]);
136
137     return;
138 }
139
140 sub _is_valid_class_name {
141     my $class = shift;
142
143     return 0 if ref($class);
144     return 0 unless defined($class);
145     return 0 unless length($class);
146
147     return 1 if $class =~ /^\w+(?:::\w+)*$/;
148
149     return 0;
150 }
151
152 ## ----------------------------------------------------------------------------
153 ## Setting up our environment ...
154 ## ----------------------------------------------------------------------------
155 ## Class::MOP needs to have a few things in the global perl environment so
156 ## that it can operate effectively. Those things are done here.
157 ## ----------------------------------------------------------------------------
158
159 # ... nothing yet actually ;)
160
161 ## ----------------------------------------------------------------------------
162 ## Bootstrapping
163 ## ----------------------------------------------------------------------------
164 ## The code below here is to bootstrap our MOP with itself. This is also
165 ## sometimes called "tying the knot". By doing this, we make it much easier
166 ## to extend the MOP through subclassing and such since now you can use the
167 ## MOP itself to extend itself.
168 ##
169 ## Yes, I know, thats weird and insane, but it's a good thing, trust me :)
170 ## ----------------------------------------------------------------------------
171
172 # We need to add in the meta-attributes here so that
173 # any subclass of Class::MOP::* will be able to
174 # inherit them using _construct_instance
175
176 ## --------------------------------------------------------
177 ## Class::MOP::Package
178
179 Class::MOP::Package->meta->add_attribute(
180     Class::MOP::Attribute->new('package' => (
181         reader   => {
182             # NOTE: we need to do this in order
183             # for the instance meta-object to
184             # not fall into meta-circular death
185             #
186             # we just alias the original method
187             # rather than re-produce it here
188             'name' => \&Class::MOP::Package::name
189         },
190     ))
191 );
192
193 Class::MOP::Package->meta->add_attribute(
194     Class::MOP::Attribute->new('namespace' => (
195         reader => {
196             # NOTE:
197             # we just alias the original method
198             # rather than re-produce it here
199             'namespace' => \&Class::MOP::Package::namespace
200         },
201         init_arg => undef,
202         default  => sub { \undef }
203     ))
204 );
205
206 Class::MOP::Package->meta->add_attribute(
207     Class::MOP::Attribute->new('methods' => (
208         reader   => {
209             # NOTE:
210             # we just alias the original method
211             # rather than re-produce it here
212             'get_method_map' => \&Class::MOP::Package::get_method_map
213         },
214         default => sub { {} }
215     ))
216 );
217
218 Class::MOP::Package->meta->add_attribute(
219     Class::MOP::Attribute->new('method_metaclass' => (
220         reader   => {
221             # NOTE:
222             # we just alias the original method
223             # rather than re-produce it here
224             'method_metaclass' => \&Class::MOP::Package::method_metaclass
225         },
226         default  => 'Class::MOP::Method',
227     ))
228 );
229
230 Class::MOP::Package->meta->add_attribute(
231     Class::MOP::Attribute->new('wrapped_method_metaclass' => (
232         reader   => {
233             # NOTE:
234             # we just alias the original method
235             # rather than re-produce it here
236             'wrapped_method_metaclass' => \&Class::MOP::Package::wrapped_method_metaclass
237         },
238         default  => 'Class::MOP::Method::Wrapped',
239     ))
240 );
241
242 ## --------------------------------------------------------
243 ## Class::MOP::Module
244
245 # NOTE:
246 # yeah this is kind of stretching things a bit,
247 # but truthfully the version should be an attribute
248 # of the Module, the weirdness comes from having to
249 # stick to Perl 5 convention and store it in the
250 # $VERSION package variable. Basically if you just
251 # squint at it, it will look how you want it to look.
252 # Either as a package variable, or as a attribute of
253 # the metaclass, isn't abstraction great :)
254
255 Class::MOP::Module->meta->add_attribute(
256     Class::MOP::Attribute->new('version' => (
257         reader => {
258             # NOTE:
259             # we just alias the original method
260             # rather than re-produce it here
261             'version' => \&Class::MOP::Module::version
262         },
263         init_arg => undef,
264         default  => sub { \undef }
265     ))
266 );
267
268 # NOTE:
269 # By following the same conventions as version here,
270 # we are opening up the possibility that people can
271 # use the $AUTHORITY in non-Class::MOP modules as
272 # well.
273
274 Class::MOP::Module->meta->add_attribute(
275     Class::MOP::Attribute->new('authority' => (
276         reader => {
277             # NOTE:
278             # we just alias the original method
279             # rather than re-produce it here
280             'authority' => \&Class::MOP::Module::authority
281         },
282         init_arg => undef,
283         default  => sub { \undef }
284     ))
285 );
286
287 ## --------------------------------------------------------
288 ## Class::MOP::Class
289
290 Class::MOP::Class->meta->add_attribute(
291     Class::MOP::Attribute->new('attributes' => (
292         reader   => {
293             # NOTE: we need to do this in order
294             # for the instance meta-object to
295             # not fall into meta-circular death
296             #
297             # we just alias the original method
298             # rather than re-produce it here
299             'get_attribute_map' => \&Class::MOP::Class::get_attribute_map
300         },
301         default  => sub { {} }
302     ))
303 );
304
305 Class::MOP::Class->meta->add_attribute(
306     Class::MOP::Attribute->new('superclasses' => (
307         accessor => {
308             # NOTE:
309             # we just alias the original method
310             # rather than re-produce it here
311             'superclasses' => \&Class::MOP::Class::superclasses
312         },
313         init_arg => undef,
314         default  => sub { \undef }
315     ))
316 );
317
318 Class::MOP::Class->meta->add_attribute(
319     Class::MOP::Attribute->new('attribute_metaclass' => (
320         reader   => {
321             # NOTE:
322             # we just alias the original method
323             # rather than re-produce it here
324             'attribute_metaclass' => \&Class::MOP::Class::attribute_metaclass
325         },
326         default  => 'Class::MOP::Attribute',
327     ))
328 );
329
330 Class::MOP::Class->meta->add_attribute(
331     Class::MOP::Attribute->new('instance_metaclass' => (
332         reader   => {
333             # NOTE: we need to do this in order
334             # for the instance meta-object to
335             # not fall into meta-circular death
336             #
337             # we just alias the original method
338             # rather than re-produce it here
339             'instance_metaclass' => \&Class::MOP::Class::instance_metaclass
340         },
341         default  => 'Class::MOP::Instance',
342     ))
343 );
344
345 Class::MOP::Class->meta->add_attribute(
346     Class::MOP::Attribute->new('immutable_trait' => (
347         reader   => {
348             'immutable_trait' => \&Class::MOP::Class::immutable_trait
349         },
350         default => "Class::MOP::Class::Immutable::Trait",
351     ))
352 );
353
354 Class::MOP::Class->meta->add_attribute(
355     Class::MOP::Attribute->new('constructor_name' => (
356         reader   => {
357             'constructor_name' => \&Class::MOP::Class::constructor_name,
358         },
359         default => "new",
360     ))
361 );
362
363 Class::MOP::Class->meta->add_attribute(
364     Class::MOP::Attribute->new('constructor_class' => (
365         reader   => {
366             'constructor_class' => \&Class::MOP::Class::constructor_class,
367         },
368         default => "Class::MOP::Method::Constructor",
369     ))
370 );
371
372
373 Class::MOP::Class->meta->add_attribute(
374     Class::MOP::Attribute->new('destructor_class' => (
375         reader   => {
376             'destructor_class' => \&Class::MOP::Class::destructor_class,
377         },
378     ))
379 );
380
381 # NOTE:
382 # we don't actually need to tie the knot with
383 # Class::MOP::Class here, it is actually handled
384 # within Class::MOP::Class itself in the
385 # _construct_class_instance method.
386
387 ## --------------------------------------------------------
388 ## Class::MOP::Attribute
389
390 Class::MOP::Attribute->meta->add_attribute(
391     Class::MOP::Attribute->new('name' => (
392         reader   => {
393             # NOTE: we need to do this in order
394             # for the instance meta-object to
395             # not fall into meta-circular death
396             #
397             # we just alias the original method
398             # rather than re-produce it here
399             'name' => \&Class::MOP::Attribute::name
400         }
401     ))
402 );
403
404 Class::MOP::Attribute->meta->add_attribute(
405     Class::MOP::Attribute->new('associated_class' => (
406         reader   => {
407             # NOTE: we need to do this in order
408             # for the instance meta-object to
409             # not fall into meta-circular death
410             #
411             # we just alias the original method
412             # rather than re-produce it here
413             'associated_class' => \&Class::MOP::Attribute::associated_class
414         }
415     ))
416 );
417
418 Class::MOP::Attribute->meta->add_attribute(
419     Class::MOP::Attribute->new('accessor' => (
420         reader    => { 'accessor'     => \&Class::MOP::Attribute::accessor     },
421         predicate => { 'has_accessor' => \&Class::MOP::Attribute::has_accessor },
422     ))
423 );
424
425 Class::MOP::Attribute->meta->add_attribute(
426     Class::MOP::Attribute->new('reader' => (
427         reader    => { 'reader'     => \&Class::MOP::Attribute::reader     },
428         predicate => { 'has_reader' => \&Class::MOP::Attribute::has_reader },
429     ))
430 );
431
432 Class::MOP::Attribute->meta->add_attribute(
433     Class::MOP::Attribute->new('initializer' => (
434         reader    => { 'initializer'     => \&Class::MOP::Attribute::initializer     },
435         predicate => { 'has_initializer' => \&Class::MOP::Attribute::has_initializer },
436     ))
437 );
438
439 Class::MOP::Attribute->meta->add_attribute(
440     Class::MOP::Attribute->new('definition_context' => (
441         reader    => { 'definition_context'     => \&Class::MOP::Attribute::definition_context     },
442     ))
443 );
444
445 Class::MOP::Attribute->meta->add_attribute(
446     Class::MOP::Attribute->new('writer' => (
447         reader    => { 'writer'     => \&Class::MOP::Attribute::writer     },
448         predicate => { 'has_writer' => \&Class::MOP::Attribute::has_writer },
449     ))
450 );
451
452 Class::MOP::Attribute->meta->add_attribute(
453     Class::MOP::Attribute->new('predicate' => (
454         reader    => { 'predicate'     => \&Class::MOP::Attribute::predicate     },
455         predicate => { 'has_predicate' => \&Class::MOP::Attribute::has_predicate },
456     ))
457 );
458
459 Class::MOP::Attribute->meta->add_attribute(
460     Class::MOP::Attribute->new('clearer' => (
461         reader    => { 'clearer'     => \&Class::MOP::Attribute::clearer     },
462         predicate => { 'has_clearer' => \&Class::MOP::Attribute::has_clearer },
463     ))
464 );
465
466 Class::MOP::Attribute->meta->add_attribute(
467     Class::MOP::Attribute->new('builder' => (
468         reader    => { 'builder'     => \&Class::MOP::Attribute::builder     },
469         predicate => { 'has_builder' => \&Class::MOP::Attribute::has_builder },
470     ))
471 );
472
473 Class::MOP::Attribute->meta->add_attribute(
474     Class::MOP::Attribute->new('init_arg' => (
475         reader    => { 'init_arg'     => \&Class::MOP::Attribute::init_arg     },
476         predicate => { 'has_init_arg' => \&Class::MOP::Attribute::has_init_arg },
477     ))
478 );
479
480 Class::MOP::Attribute->meta->add_attribute(
481     Class::MOP::Attribute->new('default' => (
482         # default has a custom 'reader' method ...
483         predicate => { 'has_default' => \&Class::MOP::Attribute::has_default },
484     ))
485 );
486
487 Class::MOP::Attribute->meta->add_attribute(
488     Class::MOP::Attribute->new('associated_methods' => (
489         reader   => { 'associated_methods' => \&Class::MOP::Attribute::associated_methods },
490         default  => sub { [] }
491     ))
492 );
493
494 Class::MOP::Attribute->meta->add_attribute(
495     Class::MOP::Attribute->new('insertion_order' => (
496         reader      => { 'insertion_order' => \&Class::MOP::Attribute::insertion_order },
497         writer      => { '_set_insertion_order' => \&Class::MOP::Attribute::_set_insertion_order },
498         predicate   => { 'has_insertion_order' => \&Class::MOP::Attribute::has_insertion_order },
499     ))
500 );
501
502 Class::MOP::Attribute->meta->add_method('clone' => sub {
503     my $self  = shift;
504     $self->meta->clone_object($self, @_);
505 });
506
507 ## --------------------------------------------------------
508 ## Class::MOP::Method
509 Class::MOP::Method->meta->add_attribute(
510     Class::MOP::Attribute->new('body' => (
511         reader   => { 'body' => \&Class::MOP::Method::body },
512     ))
513 );
514
515 Class::MOP::Method->meta->add_attribute(
516     Class::MOP::Attribute->new('associated_metaclass' => (
517         reader   => { 'associated_metaclass' => \&Class::MOP::Method::associated_metaclass },
518     ))
519 );
520
521 Class::MOP::Method->meta->add_attribute(
522     Class::MOP::Attribute->new('package_name' => (
523         reader   => { 'package_name' => \&Class::MOP::Method::package_name },
524     ))
525 );
526
527 Class::MOP::Method->meta->add_attribute(
528     Class::MOP::Attribute->new('name' => (
529         reader   => { 'name' => \&Class::MOP::Method::name },
530     ))
531 );
532
533 Class::MOP::Method->meta->add_attribute(
534     Class::MOP::Attribute->new('original_method' => (
535         reader   => { 'original_method'      => \&Class::MOP::Method::original_method },
536         writer   => { '_set_original_method' => \&Class::MOP::Method::_set_original_method },
537     ))
538 );
539
540 Class::MOP::Method->meta->add_method('clone' => sub {
541     my $self  = shift;
542     my $clone = $self->meta->clone_object($self, @_);
543     $clone->_set_original_method($self);
544     return $clone;
545 });
546
547 ## --------------------------------------------------------
548 ## Class::MOP::Method::Wrapped
549
550 # NOTE:
551 # the way this item is initialized, this
552 # really does not follow the standard
553 # practices of attributes, but we put
554 # it here for completeness
555 Class::MOP::Method::Wrapped->meta->add_attribute(
556     Class::MOP::Attribute->new('modifier_table')
557 );
558
559 ## --------------------------------------------------------
560 ## Class::MOP::Method::Generated
561
562 Class::MOP::Method::Generated->meta->add_attribute(
563     Class::MOP::Attribute->new('is_inline' => (
564         reader   => { 'is_inline' => \&Class::MOP::Method::Generated::is_inline },
565         default  => 0, 
566     ))
567 );
568
569 Class::MOP::Method::Generated->meta->add_attribute(
570     Class::MOP::Attribute->new('definition_context' => (
571         reader   => { 'definition_context' => \&Class::MOP::Method::Generated::definition_context },
572     ))
573 );
574
575
576 ## --------------------------------------------------------
577 ## Class::MOP::Method::Inlined
578
579 Class::MOP::Method::Inlined->meta->add_attribute(
580     Class::MOP::Attribute->new('_expected_method_class' => (
581         reader   => { '_expected_method_class' => \&Class::MOP::Method::Inlined::_expected_method_class },
582     ))
583 );
584
585 ## --------------------------------------------------------
586 ## Class::MOP::Method::Accessor
587
588 Class::MOP::Method::Accessor->meta->add_attribute(
589     Class::MOP::Attribute->new('attribute' => (
590         reader   => {
591             'associated_attribute' => \&Class::MOP::Method::Accessor::associated_attribute
592         },
593     ))
594 );
595
596 Class::MOP::Method::Accessor->meta->add_attribute(
597     Class::MOP::Attribute->new('accessor_type' => (
598         reader   => { 'accessor_type' => \&Class::MOP::Method::Accessor::accessor_type },
599     ))
600 );
601
602 ## --------------------------------------------------------
603 ## Class::MOP::Method::Constructor
604
605 Class::MOP::Method::Constructor->meta->add_attribute(
606     Class::MOP::Attribute->new('options' => (
607         reader   => {
608             'options' => \&Class::MOP::Method::Constructor::options
609         },
610         default  => sub { +{} }
611     ))
612 );
613
614 Class::MOP::Method::Constructor->meta->add_attribute(
615     Class::MOP::Attribute->new('associated_metaclass' => (
616         init_arg => "metaclass", # FIXME alias and rename
617         reader   => {
618             'associated_metaclass' => \&Class::MOP::Method::Constructor::associated_metaclass
619         },
620     ))
621 );
622
623 ## --------------------------------------------------------
624 ## Class::MOP::Instance
625
626 # NOTE:
627 # these don't yet do much of anything, but are just
628 # included for completeness
629
630 Class::MOP::Instance->meta->add_attribute(
631     Class::MOP::Attribute->new('associated_metaclass',
632         reader   => { associated_metaclass => \&Class::MOP::Instance::associated_metaclass },
633     ),
634 );
635
636 Class::MOP::Instance->meta->add_attribute(
637     Class::MOP::Attribute->new('_class_name',
638         init_arg => undef,
639         reader   => { _class_name => \&Class::MOP::Instance::_class_name },
640         #lazy     => 1, # not yet supported by Class::MOP but out our version does it anyway
641         #default  => sub { $_[0]->associated_metaclass->name },
642     ),
643 );
644
645 Class::MOP::Instance->meta->add_attribute(
646     Class::MOP::Attribute->new('attributes',
647         reader   => { attributes => \&Class::MOP::Instance::get_all_attributes },
648     ),
649 );
650
651 Class::MOP::Instance->meta->add_attribute(
652     Class::MOP::Attribute->new('slots',
653         reader   => { slots => \&Class::MOP::Instance::slots },
654     ),
655 );
656
657 Class::MOP::Instance->meta->add_attribute(
658     Class::MOP::Attribute->new('slot_hash',
659         reader   => { slot_hash => \&Class::MOP::Instance::slot_hash },
660     ),
661 );
662
663 require Class::MOP::Deprecated unless our $no_deprecated;
664
665 # we need the meta instance of the meta instance to be created now, in order
666 # for the constructor to be able to use it
667 Class::MOP::Instance->meta->get_meta_instance;
668
669 # pretend the add_method never happenned. it hasn't yet affected anything
670 undef Class::MOP::Instance->meta->{_package_cache_flag};
671
672 ## --------------------------------------------------------
673 ## Now close all the Class::MOP::* classes
674
675 # NOTE: we don't need to inline the the accessors this only lengthens
676 # the compile time of the MOP, and gives us no actual benefits.
677
678 $_->meta->make_immutable(
679     inline_constructor  => 0,
680     constructor_name    => "_new",
681     inline_accessors => 0,
682 ) for qw/
683     Class::MOP::Package
684     Class::MOP::Module
685     Class::MOP::Class
686
687     Class::MOP::Attribute
688     Class::MOP::Method
689     Class::MOP::Instance
690
691     Class::MOP::Object
692
693     Class::MOP::Method::Generated
694     Class::MOP::Method::Inlined
695
696     Class::MOP::Method::Accessor
697     Class::MOP::Method::Constructor
698     Class::MOP::Method::Wrapped
699 /;
700
701 1;
702
703 __END__
704
705 =pod
706
707 =head1 NAME
708
709 Class::MOP - A Meta Object Protocol for Perl 5
710
711 =head1 DESCRIPTION
712
713 This module is a fully functioning meta object protocol for the
714 Perl 5 object system. It makes no attempt to change the behavior or
715 characteristics of the Perl 5 object system, only to create a
716 protocol for its manipulation and introspection.
717
718 That said, it does attempt to create the tools for building a rich set
719 of extensions to the Perl 5 object system. Every attempt has been made
720 to abide by the spirit of the Perl 5 object system that we all know
721 and love.
722
723 This documentation is sparse on conceptual details. We suggest looking
724 at the items listed in the L<SEE ALSO> section for more
725 information. In particular the book "The Art of the Meta Object
726 Protocol" was very influential in the development of this system.
727
728 =head2 What is a Meta Object Protocol?
729
730 A meta object protocol is an API to an object system.
731
732 To be more specific, it abstracts the components of an object system
733 (classes, object, methods, object attributes, etc.). These
734 abstractions can then be used to inspect and manipulate the object
735 system which they describe.
736
737 It can be said that there are two MOPs for any object system; the
738 implicit MOP and the explicit MOP. The implicit MOP handles things
739 like method dispatch or inheritance, which happen automatically as
740 part of how the object system works. The explicit MOP typically
741 handles the introspection/reflection features of the object system.
742
743 All object systems have implicit MOPs. Without one, they would not
744 work. Explicit MOPs are much less common, and depending on the
745 language can vary from restrictive (Reflection in Java or C#) to wide
746 open (CLOS is a perfect example).
747
748 =head2 Yet Another Class Builder! Why?
749
750 This is B<not> a class builder so much as a I<class builder
751 B<builder>>. The intent is that an end user will not use this module
752 directly, but instead this module is used by module authors to build
753 extensions and features onto the Perl 5 object system.
754
755 This system is used by L<Moose>, which supplies a powerful class
756 builder system built entirely on top of C<Class::MOP>.
757
758 =head2 Who is this module for?
759
760 This module is for anyone who has ever created or wanted to create a
761 module for the Class:: namespace. The tools which this module provides
762 make doing complex Perl 5 wizardry simpler, by removing such barriers
763 as the need to hack symbol tables, or understand the fine details of
764 method dispatch.
765
766 =head2 What changes do I have to make to use this module?
767
768 This module was designed to be as unintrusive as possible. Many of its
769 features are accessible without B<any> change to your existing
770 code. It is meant to be a compliment to your existing code and not an
771 intrusion on your code base. Unlike many other B<Class::> modules,
772 this module B<does not> require you subclass it, or even that you
773 C<use> it in within your module's package.
774
775 The only features which requires additions to your code are the
776 attribute handling and instance construction features, and these are
777 both completely optional features. The only reason for this is because
778 Perl 5's object system does not actually have these features built
779 in. More information about this feature can be found below.
780
781 =head2 About Performance
782
783 It is a common misconception that explicit MOPs are a performance hit.
784 This is not a universal truth, it is a side-effect of some specific
785 implementations. For instance, using Java reflection is slow because
786 the JVM cannot take advantage of any compiler optimizations, and the
787 JVM has to deal with much more runtime type information as well.
788
789 Reflection in C# is marginally better as it was designed into the
790 language and runtime (the CLR). In contrast, CLOS (the Common Lisp
791 Object System) was built to support an explicit MOP, and so
792 performance is tuned for it.
793
794 This library in particular does its absolute best to avoid putting
795 B<any> drain at all upon your code's performance. In fact, by itself
796 it does nothing to affect your existing code. So you only pay for what
797 you actually use.
798
799 =head2 About Metaclass compatibility
800
801 This module makes sure that all metaclasses created are both upwards
802 and downwards compatible. The topic of metaclass compatibility is
803 highly esoteric and is something only encountered when doing deep and
804 involved metaclass hacking. There are two basic kinds of metaclass
805 incompatibility; upwards and downwards.
806
807 Upwards metaclass compatibility means that the metaclass of a
808 given class is either the same as (or a subclass of) all of the
809 class's ancestors.
810
811 Downward metaclass compatibility means that the metaclasses of a
812 given class's ancestors are all either the same as (or a subclass
813 of) that metaclass.
814
815 Here is a diagram showing a set of two classes (C<A> and C<B>) and
816 two metaclasses (C<Meta::A> and C<Meta::B>) which have correct
817 metaclass compatibility both upwards and downwards.
818
819     +---------+     +---------+
820     | Meta::A |<----| Meta::B |      <....... (instance of  )
821     +---------+     +---------+      <------- (inherits from)
822          ^               ^
823          :               :
824     +---------+     +---------+
825     |    A    |<----|    B    |
826     +---------+     +---------+
827
828 As I said this is a highly esoteric topic and one you will only run
829 into if you do a lot of subclassing of L<Class::MOP::Class>. If you
830 are interested in why this is an issue see the paper I<Uniform and
831 safe metaclass composition> linked to in the L<SEE ALSO> section of
832 this document.
833
834 =head2 Using custom metaclasses
835
836 Always use the L<metaclass> pragma when using a custom metaclass, this
837 will ensure the proper initialization order and not accidentally
838 create an incorrect type of metaclass for you. This is a very rare
839 problem, and one which can only occur if you are doing deep metaclass
840 programming. So in other words, don't worry about it.
841
842 Note that if you're using L<Moose> we encourage you to I<not> use
843 L<metaclass> pragma, and instead use L<Moose::Util::MetaRole> to apply
844 roles to a class's metaclasses. This topic is covered at length in
845 various L<Moose::Cookbook> recipes.
846
847 =head1 PROTOCOLS
848
849 The meta-object protocol is divided into 4 main sub-protocols:
850
851 =head2 The Class protocol
852
853 This provides a means of manipulating and introspecting a Perl 5
854 class. It handles symbol table hacking for you, and provides a rich
855 set of methods that go beyond simple package introspection.
856
857 See L<Class::MOP::Class> for more details.
858
859 =head2 The Attribute protocol
860
861 This provides a consistent representation for an attribute of a Perl 5
862 class. Since there are so many ways to create and handle attributes in
863 Perl 5 OO, the Attribute protocol provide as much of a unified
864 approach as possible. Of course, you are always free to extend this
865 protocol by subclassing the appropriate classes.
866
867 See L<Class::MOP::Attribute> for more details.
868
869 =head2 The Method protocol
870
871 This provides a means of manipulating and introspecting methods in the
872 Perl 5 object system. As with attributes, there are many ways to
873 approach this topic, so we try to keep it pretty basic, while still
874 making it possible to extend the system in many ways.
875
876 See L<Class::MOP::Method> for more details.
877
878 =head2 The Instance protocol
879
880 This provides a layer of abstraction for creating object instances.
881 Since the other layers use this protocol, it is relatively easy to
882 change the type of your instances from the default hash reference to
883 some other type of reference. Several examples are provided in the
884 F<examples/> directory included in this distribution.
885
886 See L<Class::MOP::Instance> for more details.
887
888 =head1 FUNCTIONS
889
890 Note that this module does not export any constants or functions.
891
892 =head2 Constants
893
894 =over 4
895
896 =item I<Class::MOP::IS_RUNNING_ON_5_10>
897
898 We set this constant depending on what version perl we are on, this
899 allows us to take advantage of new 5.10 features and stay backwards
900 compatible.
901
902 =back
903
904 =head2 Utility functions
905
906 Note that these are all called as B<functions, not methods>.
907
908 =over 4
909
910 =item B<Class::MOP::load_class($class_name)>
911
912 This will load the specified C<$class_name>, if it is not already
913 loaded (as reported by C<is_class_loaded>). This function can be used
914 in place of tricks like C<eval "use $module"> or using C<require>
915 unconditionally.
916
917 =item B<Class::MOP::is_class_loaded($class_name)>
918
919 Returns a boolean indicating whether or not C<$class_name> has been
920 loaded.
921
922 This does a basic check of the symbol table to try and determine as
923 best it can if the C<$class_name> is loaded, it is probably correct
924 about 99% of the time, but it can be fooled into reporting false
925 positives. In particular, loading any of the core L<IO> modules will
926 cause most of the rest of the core L<IO> modules to falsely report
927 having been loaded, due to the way the base L<IO> module works.
928
929 =item B<Class::MOP::get_code_info($code)>
930
931 This function returns two values, the name of the package the C<$code>
932 is from and the name of the C<$code> itself. This is used by several
933 elements of the MOP to determine where a given C<$code> reference is
934 from.
935
936 =item B<Class::MOP::class_of($instance_or_class_name)>
937
938 This will return the metaclass of the given instance or class name.  If the
939 class lacks a metaclass, no metaclass will be initialized, and C<undef> will be
940 returned.
941
942 =item B<Class::MOP::check_package_cache_flag($pkg)>
943
944 B<NOTE: DO NOT USE THIS FUNCTION, IT IS FOR INTERNAL USE ONLY!>
945
946 This will return an integer that is managed by L<Class::MOP::Class> to
947 determine if a module's symbol table has been altered.
948
949 In Perl 5.10 or greater, this flag is package specific. However in
950 versions prior to 5.10, this will use the C<PL_sub_generation>
951 variable which is not package specific.
952
953 =item B<Class::MOP::load_first_existing_class(@class_names)>
954
955 B<NOTE: DO NOT USE THIS FUNCTION, IT IS FOR INTERNAL USE ONLY!>
956
957 Given a list of class names, this function will attempt to load each
958 one in turn.
959
960 If it finds a class it can load, it will return that class' name.  If
961 none of the classes can be loaded, it will throw an exception.
962
963 =back
964
965 =head2 Metaclass cache functions
966
967 Class::MOP holds a cache of metaclasses. The following are functions
968 (B<not methods>) which can be used to access that cache. It is not
969 recommended that you mess with these. Bad things could happen, but if
970 you are brave and willing to risk it: go for it!
971
972 =over 4
973
974 =item B<Class::MOP::get_all_metaclasses>
975
976 This will return a hash of all the metaclass instances that have
977 been cached by L<Class::MOP::Class>, keyed by the package name.
978
979 =item B<Class::MOP::get_all_metaclass_instances>
980
981 This will return a list of all the metaclass instances that have
982 been cached by L<Class::MOP::Class>.
983
984 =item B<Class::MOP::get_all_metaclass_names>
985
986 This will return a list of all the metaclass names that have
987 been cached by L<Class::MOP::Class>.
988
989 =item B<Class::MOP::get_metaclass_by_name($name)>
990
991 This will return a cached L<Class::MOP::Class> instance, or nothing
992 if no metaclass exists with that C<$name>.
993
994 =item B<Class::MOP::store_metaclass_by_name($name, $meta)>
995
996 This will store a metaclass in the cache at the supplied C<$key>.
997
998 =item B<Class::MOP::weaken_metaclass($name)>
999
1000 In rare cases (e.g. anonymous metaclasses) it is desirable to
1001 store a weakened reference in the metaclass cache. This
1002 function will weaken the reference to the metaclass stored
1003 in C<$name>.
1004
1005 =item B<Class::MOP::does_metaclass_exist($name)>
1006
1007 This will return true of there exists a metaclass stored in the
1008 C<$name> key, and return false otherwise.
1009
1010 =item B<Class::MOP::remove_metaclass_by_name($name)>
1011
1012 This will remove the metaclass stored in the C<$name> key.
1013
1014 =back
1015
1016 =head1 SEE ALSO
1017
1018 =head2 Books
1019
1020 There are very few books out on Meta Object Protocols and Metaclasses
1021 because it is such an esoteric topic. The following books are really
1022 the only ones I have found. If you know of any more, B<I<please>>
1023 email me and let me know, I would love to hear about them.
1024
1025 =over 4
1026
1027 =item I<The Art of the Meta Object Protocol>
1028
1029 =item I<Advances in Object-Oriented Metalevel Architecture and Reflection>
1030
1031 =item I<Putting MetaClasses to Work>
1032
1033 =item I<Smalltalk: The Language>
1034
1035 =back
1036
1037 =head2 Papers
1038
1039 =over 4
1040
1041 =item "Uniform and safe metaclass composition"
1042
1043 An excellent paper by the people who brought us the original Traits paper.
1044 This paper is on how Traits can be used to do safe metaclass composition,
1045 and offers an excellent introduction section which delves into the topic of
1046 metaclass compatibility.
1047
1048 L<http://www.iam.unibe.ch/~scg/Archive/Papers/Duca05ySafeMetaclassTrait.pdf>
1049
1050 =item "Safe Metaclass Programming"
1051
1052 This paper seems to precede the above paper, and propose a mix-in based
1053 approach as opposed to the Traits based approach. Both papers have similar
1054 information on the metaclass compatibility problem space.
1055
1056 L<http://citeseer.ist.psu.edu/37617.html>
1057
1058 =back
1059
1060 =head2 Prior Art
1061
1062 =over 4
1063
1064 =item The Perl 6 MetaModel work in the Pugs project
1065
1066 =over 4
1067
1068 =item L<http://svn.openfoundry.org/pugs/misc/Perl-MetaModel/>
1069
1070 =item L<http://svn.openfoundry.org/pugs/perl5/Perl6-ObjectSpace>
1071
1072 =back
1073
1074 =back
1075
1076 =head2 Articles
1077
1078 =over 4
1079
1080 =item CPAN Module Review of Class::MOP
1081
1082 L<http://www.oreillynet.com/onlamp/blog/2006/06/cpan_module_review_classmop.html>
1083
1084 =back
1085
1086 =head1 SIMILAR MODULES
1087
1088 As I have said above, this module is a class-builder-builder, so it is
1089 not the same thing as modules like L<Class::Accessor> and
1090 L<Class::MethodMaker>. That being said there are very few modules on CPAN
1091 with similar goals to this module. The one I have found which is most
1092 like this module is L<Class::Meta>, although it's philosophy and the MOP it
1093 creates are very different from this modules.
1094
1095 =head1 BUGS
1096
1097 All complex software has bugs lurking in it, and this module is no
1098 exception.
1099
1100 Please report any bugs to C<bug-class-mop@rt.cpan.org>, or through the
1101 web interface at L<http://rt.cpan.org>.
1102
1103 You can also discuss feature requests or possible bugs on the Moose
1104 mailing list (moose@perl.org) or on IRC at
1105 L<irc://irc.perl.org/#moose>.
1106
1107 =head1 ACKNOWLEDGEMENTS
1108
1109 =over 4
1110
1111 =item Rob Kinyon
1112
1113 Thanks to Rob for actually getting the development of this module kick-started.
1114
1115 =back
1116
1117 =head1 AUTHORS
1118
1119 Stevan Little E<lt>stevan@iinteractive.comE<gt>
1120
1121 B<with contributions from:>
1122
1123 Brandon (blblack) Black
1124
1125 Florian (rafl) Ragwitz
1126
1127 Guillermo (groditi) Roditi
1128
1129 Dave (autarch) Rolsky
1130
1131 Matt (mst) Trout
1132
1133 Rob (robkinyon) Kinyon
1134
1135 Yuval (nothingmuch) Kogman
1136
1137 Scott (konobi) McWhirter
1138
1139 Dylan Hardison
1140
1141 =head1 COPYRIGHT AND LICENSE
1142
1143 Copyright 2006-2009 by Infinity Interactive, Inc.
1144
1145 L<http://www.iinteractive.com>
1146
1147 This library is free software; you can redistribute it and/or modify
1148 it under the same terms as Perl itself.
1149
1150 =cut