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