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