Big optimization for get_method_list
[gitmo/Class-MOP.git] / lib / Class / MOP / Class.pm
1
2 package Class::MOP::Class;
3
4 use strict;
5 use warnings;
6
7 use Class::MOP::Instance;
8 use Class::MOP::Method::Wrapped;
9 use Class::MOP::Method::Accessor;
10 use Class::MOP::Method::Constructor;
11
12 use Carp         'confess';
13 use Scalar::Util 'blessed', 'reftype', 'weaken';
14 use Sub::Name    'subname';
15 use Devel::GlobalDestruction 'in_global_destruction';
16 use Try::Tiny;
17 use List::MoreUtils 'all';
18
19 our $VERSION   = '1.04';
20 $VERSION = eval $VERSION;
21 our $AUTHORITY = 'cpan:STEVAN';
22
23 use base 'Class::MOP::Module',
24          'Class::MOP::Mixin::HasAttributes',
25          'Class::MOP::Mixin::HasMethods';
26
27 # Creation
28
29 sub initialize {
30     my $class = shift;
31
32     my $package_name;
33     
34     if ( @_ % 2 ) {
35         $package_name = shift;
36     } else {
37         my %options = @_;
38         $package_name = $options{package};
39     }
40
41     ($package_name && !ref($package_name))
42         || confess "You must pass a package name and it cannot be blessed";
43
44     return Class::MOP::get_metaclass_by_name($package_name)
45         || $class->_construct_class_instance(package => $package_name, @_);
46 }
47
48 # NOTE: (meta-circularity)
49 # this is a special form of _construct_instance
50 # (see below), which is used to construct class
51 # meta-object instances for any Class::MOP::*
52 # class. All other classes will use the more
53 # normal &construct_instance.
54 sub _construct_class_instance {
55     my $class        = shift;
56     my $options      = @_ == 1 ? $_[0] : {@_};
57     my $package_name = $options->{package};
58     (defined $package_name && $package_name)
59         || confess "You must pass a package name";
60     # NOTE:
61     # return the metaclass if we have it cached,
62     # and it is still defined (it has not been
63     # reaped by DESTROY yet, which can happen
64     # annoyingly enough during global destruction)
65
66     if (defined(my $meta = Class::MOP::get_metaclass_by_name($package_name))) {
67         return $meta;
68     }
69
70     $class
71         = ref $class
72         ? $class->_real_ref_name
73         : $class;
74
75     # now create the metaclass
76     my $meta;
77     if ($class eq 'Class::MOP::Class') {
78         $meta = $class->_new($options);
79     }
80     else {
81         # NOTE:
82         # it is safe to use meta here because
83         # class will always be a subclass of
84         # Class::MOP::Class, which defines meta
85         $meta = $class->meta->_construct_instance($options)
86     }
87
88     # and check the metaclass compatibility
89     $meta->_check_metaclass_compatibility();  
90
91     Class::MOP::store_metaclass_by_name($package_name, $meta);
92
93     # NOTE:
94     # we need to weaken any anon classes
95     # so that they can call DESTROY properly
96     Class::MOP::weaken_metaclass($package_name) if $meta->is_anon_class;
97
98     $meta;
99 }
100
101 sub _real_ref_name {
102     my $self = shift;
103
104     # NOTE: we need to deal with the possibility of class immutability here,
105     # and then get the name of the class appropriately
106     return $self->is_immutable
107         ? $self->_get_mutable_metaclass_name()
108         : ref $self;
109 }
110
111 sub _new {
112     my $class = shift;
113
114     return Class::MOP::Class->initialize($class)->new_object(@_)
115         if $class ne __PACKAGE__;
116
117     my $options = @_ == 1 ? $_[0] : {@_};
118
119     return bless {
120         # inherited from Class::MOP::Package
121         'package' => $options->{package},
122
123         # NOTE:
124         # since the following attributes will
125         # actually be loaded from the symbol
126         # table, and actually bypass the instance
127         # entirely, we can just leave these things
128         # listed here for reference, because they
129         # should not actually have a value associated
130         # with the slot.
131         'namespace' => \undef,
132         'methods'   => {},
133
134         # inherited from Class::MOP::Module
135         'version'   => \undef,
136         'authority' => \undef,
137
138         # defined in Class::MOP::Class
139         'superclasses' => \undef,
140
141         'attributes' => {},
142         'attribute_metaclass' =>
143             ( $options->{'attribute_metaclass'} || 'Class::MOP::Attribute' ),
144         'method_metaclass' =>
145             ( $options->{'method_metaclass'} || 'Class::MOP::Method' ),
146         'wrapped_method_metaclass' => (
147             $options->{'wrapped_method_metaclass'}
148                 || 'Class::MOP::Method::Wrapped'
149         ),
150         'instance_metaclass' =>
151             ( $options->{'instance_metaclass'} || 'Class::MOP::Instance' ),
152         'immutable_trait' => (
153             $options->{'immutable_trait'}
154                 || 'Class::MOP::Class::Immutable::Trait'
155         ),
156         'constructor_name' => ( $options->{constructor_name} || 'new' ),
157         'constructor_class' => (
158             $options->{constructor_class} || 'Class::MOP::Method::Constructor'
159         ),
160         'destructor_class' => $options->{destructor_class},
161     }, $class;
162 }
163
164 sub reset_package_cache_flag  { (shift)->{'_package_cache_flag'} = undef } 
165 sub update_package_cache_flag {
166     my $self = shift;
167     # NOTE:
168     # we can manually update the cache number 
169     # since we are actually adding the method
170     # to our cache as well. This avoids us 
171     # having to regenerate the method_map.
172     # - SL    
173     $self->{'_package_cache_flag'} = Class::MOP::check_package_cache_flag($self->name);    
174 }
175
176 ## Metaclass compatibility
177 {
178     my %base_metaclass = (
179         attribute_metaclass      => 'Class::MOP::Attribute',
180         method_metaclass         => 'Class::MOP::Method',
181         wrapped_method_metaclass => 'Class::MOP::Method::Wrapped',
182         instance_metaclass       => 'Class::MOP::Instance',
183         constructor_class        => 'Class::MOP::Method::Constructor',
184         destructor_class         => 'Class::MOP::Method::Destructor',
185     );
186
187     sub _base_metaclasses { %base_metaclass }
188 }
189
190 sub _check_metaclass_compatibility {
191     my $self = shift;
192
193     my @superclasses = $self->superclasses
194         or return;
195
196     $self->_fix_metaclass_incompatibility(@superclasses);
197
198     my %base_metaclass = $self->_base_metaclasses;
199
200     # this is always okay ...
201     return
202         if ref($self) eq 'Class::MOP::Class'
203             && all {
204                 my $meta = $self->$_;
205                 !defined($meta) || $meta eq $base_metaclass{$_};
206         }
207         keys %base_metaclass;
208
209     for my $superclass (@superclasses) {
210         $self->_check_class_metaclass_compatibility($superclass);
211     }
212
213     for my $metaclass_type ( keys %base_metaclass ) {
214         next unless defined $self->$metaclass_type;
215         for my $superclass (@superclasses) {
216             $self->_check_single_metaclass_compatibility( $metaclass_type,
217                 $superclass );
218         }
219     }
220 }
221
222 sub _class_metaclass_is_compatible {
223     my $self = shift;
224     my ( $superclass_name ) = @_;
225
226     my $super_meta = Class::MOP::get_metaclass_by_name($superclass_name)
227         || return 1;
228
229     my $super_meta_type = $super_meta->_real_ref_name;
230
231     return $self->isa($super_meta_type);
232 }
233
234 sub _check_class_metaclass_compatibility {
235     my $self = shift;
236     my ( $superclass_name ) = @_;
237
238     if (!$self->_class_metaclass_is_compatible($superclass_name)) {
239         my $super_meta = Class::MOP::get_metaclass_by_name($superclass_name);
240
241         my $super_meta_type = $super_meta->_real_ref_name;
242
243         confess "The metaclass of " . $self->name . " ("
244               . (ref($self)) . ")" .  " is not compatible with "
245               . "the metaclass of its superclass, "
246               . $superclass_name . " (" . ($super_meta_type) . ")";
247     }
248 }
249
250 sub _single_metaclass_is_compatible {
251     my $self = shift;
252     my ( $metaclass_type, $superclass_name ) = @_;
253
254     my $super_meta = Class::MOP::get_metaclass_by_name($superclass_name)
255         || return 1;
256
257     # for instance, Moose::Meta::Class has a error_class attribute, but
258     # Class::MOP::Class doesn't - this shouldn't be an error
259     return 1 unless $super_meta->can($metaclass_type);
260     # for instance, Moose::Meta::Class has a destructor_class, but
261     # Class::MOP::Class doesn't - this shouldn't be an error
262     return 1 unless defined $super_meta->$metaclass_type;
263     # if metaclass is defined in superclass but not here, it's not compatible
264     # this is a really odd case
265     return 0 unless defined $self->$metaclass_type;
266
267     return $self->$metaclass_type->isa($super_meta->$metaclass_type);
268 }
269
270 sub _check_single_metaclass_compatibility {
271     my $self = shift;
272     my ( $metaclass_type, $superclass_name ) = @_;
273
274     if (!$self->_single_metaclass_is_compatible($metaclass_type, $superclass_name)) {
275         my $super_meta = Class::MOP::get_metaclass_by_name($superclass_name);
276         my $metaclass_type_name = $metaclass_type;
277         $metaclass_type_name =~ s/_(?:meta)?class$//;
278         $metaclass_type_name =~ s/_/ /g;
279         confess "The $metaclass_type_name metaclass for "
280               . $self->name . " (" . ($self->$metaclass_type)
281               . ")" . " is not compatible with the "
282               . "$metaclass_type_name metaclass of its "
283               . "superclass, " . $superclass_name . " ("
284               . ($super_meta->$metaclass_type) . ")";
285     }
286 }
287
288 sub _can_fix_class_metaclass_incompatibility_by_subclassing {
289     my $self = shift;
290     my ($super_meta) = @_;
291
292     my $super_meta_type = $super_meta->_real_ref_name;
293
294     return $super_meta_type ne blessed($self)
295         && $super_meta->isa(blessed($self));
296 }
297
298 sub _can_fix_single_metaclass_incompatibility_by_subclassing {
299     my $self = shift;
300     my ($metaclass_type, $super_meta) = @_;
301
302     my $specific_meta = $self->$metaclass_type;
303     return unless $super_meta->can($metaclass_type);
304     my $super_specific_meta = $super_meta->$metaclass_type;
305
306     # for instance, Moose::Meta::Class has a destructor_class, but
307     # Class::MOP::Class doesn't - this shouldn't be an error
308     return unless defined $super_specific_meta;
309
310     # if metaclass is defined in superclass but not here, it's fixable
311     # this is a really odd case
312     return 1 unless defined $specific_meta;
313
314     return $specific_meta ne $super_specific_meta
315         && $super_specific_meta->isa($specific_meta);
316 }
317
318 sub _can_fix_metaclass_incompatibility_by_subclassing {
319     my $self = shift;
320     my ($super_meta) = @_;
321
322     return 1 if $self->_can_fix_class_metaclass_incompatibility_by_subclassing($super_meta);
323
324     my %base_metaclass = $self->_base_metaclasses;
325     for my $metaclass_type (keys %base_metaclass) {
326         return 1 if $self->_can_fix_single_metaclass_incompatibility_by_subclassing($metaclass_type, $super_meta);
327     }
328
329     return;
330 }
331
332 sub _can_fix_metaclass_incompatibility {
333     my $self = shift;
334     return $self->_can_fix_metaclass_incompatibility_by_subclassing(@_);
335 }
336
337 sub _fix_metaclass_incompatibility {
338     my $self = shift;
339     my @supers = map { Class::MOP::Class->initialize($_) } @_;
340
341     my $necessary = 0;
342     for my $super (@supers) {
343         $necessary = 1
344             if $self->_can_fix_metaclass_incompatibility($super);
345     }
346     return unless $necessary;
347
348     for my $super (@supers) {
349         if (!$self->_class_metaclass_is_compatible($super->name)) {
350             $self->_fix_class_metaclass_incompatibility($super);
351         }
352     }
353
354     my %base_metaclass = $self->_base_metaclasses;
355     for my $metaclass_type (keys %base_metaclass) {
356         for my $super (@supers) {
357             if (!$self->_single_metaclass_is_compatible($metaclass_type, $super->name)) {
358                 $self->_fix_single_metaclass_incompatibility(
359                     $metaclass_type, $super
360                 );
361             }
362         }
363     }
364 }
365
366 sub _fix_class_metaclass_incompatibility {
367     my $self = shift;
368     my ( $super_meta ) = @_;
369
370     if ($self->_can_fix_class_metaclass_incompatibility_by_subclassing($super_meta)) {
371         ($self->is_pristine)
372             || confess "Can't fix metaclass incompatibility for "
373                      . $self->name
374                      . " because it is not pristine.";
375
376         my $super_meta_name = $super_meta->_real_ref_name;
377
378         $super_meta_name->meta->rebless_instance($self);
379     }
380 }
381
382 sub _fix_single_metaclass_incompatibility {
383     my $self = shift;
384     my ( $metaclass_type, $super_meta ) = @_;
385
386     if ($self->_can_fix_single_metaclass_incompatibility_by_subclassing($metaclass_type, $super_meta)) {
387         ($self->is_pristine)
388             || confess "Can't fix metaclass incompatibility for "
389                      . $self->name
390                      . " because it is not pristine.";
391
392         $self->{$metaclass_type} = $super_meta->$metaclass_type;
393     }
394 }
395
396 ## ANON classes
397
398 {
399     # NOTE:
400     # this should be sufficient, if you have a
401     # use case where it is not, write a test and
402     # I will change it.
403     my $ANON_CLASS_SERIAL = 0;
404
405     # NOTE:
406     # we need a sufficiently annoying prefix
407     # this should suffice for now, this is
408     # used in a couple of places below, so
409     # need to put it up here for now.
410     my $ANON_CLASS_PREFIX = 'Class::MOP::Class::__ANON__::SERIAL::';
411
412     sub is_anon_class {
413         my $self = shift;
414         no warnings 'uninitialized';
415         $self->name =~ /^$ANON_CLASS_PREFIX/o;
416     }
417
418     sub create_anon_class {
419         my ($class, %options) = @_;
420         my $package_name = $ANON_CLASS_PREFIX . ++$ANON_CLASS_SERIAL;
421         return $class->create($package_name, %options);
422     }
423
424     # NOTE:
425     # this will only get called for
426     # anon-classes, all other calls
427     # are assumed to occur during
428     # global destruction and so don't
429     # really need to be handled explicitly
430     sub DESTROY {
431         my $self = shift;
432
433         return if in_global_destruction(); # it'll happen soon anyway and this just makes things more complicated
434
435         no warnings 'uninitialized';
436         my $name = $self->name;
437         return unless $name =~ /^$ANON_CLASS_PREFIX/o;
438
439         # Moose does a weird thing where it replaces the metaclass for
440         # class when fixing metaclass incompatibility. In that case,
441         # we don't want to clean out the namespace now. We can detect
442         # that because Moose will explicitly update the singleton
443         # cache in Class::MOP.
444         my $current_meta = Class::MOP::get_metaclass_by_name($name);
445         return if $current_meta ne $self;
446
447         my ($serial_id) = ($name =~ /^$ANON_CLASS_PREFIX(\d+)/o);
448         no strict 'refs';
449         @{$name . '::ISA'} = ();
450         %{$name . '::'}    = ();
451         delete ${$ANON_CLASS_PREFIX}{$serial_id . '::'};
452
453         Class::MOP::remove_metaclass_by_name($name);
454     }
455
456 }
457
458 # creating classes with MOP ...
459
460 sub create {
461     my ( $class, @args ) = @_;
462
463     unshift @args, 'package' if @args % 2 == 1;
464
465     my (%options) = @args;
466     my $package_name = $options{package};
467
468     (ref $options{superclasses} eq 'ARRAY')
469         || confess "You must pass an ARRAY ref of superclasses"
470             if exists $options{superclasses};
471             
472     (ref $options{attributes} eq 'ARRAY')
473         || confess "You must pass an ARRAY ref of attributes"
474             if exists $options{attributes};      
475             
476     (ref $options{methods} eq 'HASH')
477         || confess "You must pass a HASH ref of methods"
478             if exists $options{methods};                  
479
480     my (%initialize_options) = @args;
481     delete @initialize_options{qw(
482         package
483         superclasses
484         attributes
485         methods
486         version
487         authority
488     )};
489     my $meta = $class->initialize( $package_name => %initialize_options );
490
491     $meta->_instantiate_module( $options{version}, $options{authority} );
492
493     # FIXME totally lame
494     $meta->add_method('meta' => sub {
495         $class->initialize(ref($_[0]) || $_[0]);
496     });
497
498     $meta->superclasses(@{$options{superclasses}})
499         if exists $options{superclasses};
500     # NOTE:
501     # process attributes first, so that they can
502     # install accessors, but locally defined methods
503     # can then overwrite them. It is maybe a little odd, but
504     # I think this should be the order of things.
505     if (exists $options{attributes}) {
506         foreach my $attr (@{$options{attributes}}) {
507             $meta->add_attribute($attr);
508         }
509     }
510     if (exists $options{methods}) {
511         foreach my $method_name (keys %{$options{methods}}) {
512             $meta->add_method($method_name, $options{methods}->{$method_name});
513         }
514     }
515     return $meta;
516 }
517
518 ## Attribute readers
519
520 # NOTE:
521 # all these attribute readers will be bootstrapped
522 # away in the Class::MOP bootstrap section
523
524 sub instance_metaclass       { $_[0]->{'instance_metaclass'}          }
525 sub immutable_trait          { $_[0]->{'immutable_trait'}             }
526 sub constructor_class        { $_[0]->{'constructor_class'}           }
527 sub constructor_name         { $_[0]->{'constructor_name'}            }
528 sub destructor_class         { $_[0]->{'destructor_class'}            }
529
530 # Instance Construction & Cloning
531
532 sub new_object {
533     my $class = shift;
534
535     # NOTE:
536     # we need to protect the integrity of the
537     # Class::MOP::Class singletons here, so we
538     # delegate this to &construct_class_instance
539     # which will deal with the singletons
540     return $class->_construct_class_instance(@_)
541         if $class->name->isa('Class::MOP::Class');
542     return $class->_construct_instance(@_);
543 }
544
545 sub _construct_instance {
546     my $class = shift;
547     my $params = @_ == 1 ? $_[0] : {@_};
548     my $meta_instance = $class->get_meta_instance();
549     # FIXME:
550     # the code below is almost certainly incorrect
551     # but this is foreign inheritance, so we might
552     # have to kludge it in the end.
553     my $instance;
554     if (my $instance_class = blessed($params->{__INSTANCE__})) {
555         ($instance_class eq $class->name)
556             || confess "Objects passed as the __INSTANCE__ parameter must "
557                      . "already be blessed into the correct class, but "
558                      . "$params->{__INSTANCE__} is not a " . $class->name;
559         $instance = $params->{__INSTANCE__};
560     }
561     elsif (exists $params->{__INSTANCE__}) {
562         confess "The __INSTANCE__ parameter must be a blessed reference, not "
563               . $params->{__INSTANCE__};
564     }
565     else {
566         $instance = $meta_instance->create_instance();
567     }
568     foreach my $attr ($class->get_all_attributes()) {
569         $attr->initialize_instance_slot($meta_instance, $instance, $params);
570     }
571     # NOTE:
572     # this will only work for a HASH instance type
573     if ($class->is_anon_class) {
574         (reftype($instance) eq 'HASH')
575             || confess "Currently only HASH based instances are supported with instance of anon-classes";
576         # NOTE:
577         # At some point we should make this official
578         # as a reserved slot name, but right now I am
579         # going to keep it here.
580         # my $RESERVED_MOP_SLOT = '__MOP__';
581         $instance->{'__MOP__'} = $class;
582     }
583     return $instance;
584 }
585
586
587 sub get_meta_instance {
588     my $self = shift;
589     $self->{'_meta_instance'} ||= $self->_create_meta_instance();
590 }
591
592 sub _create_meta_instance {
593     my $self = shift;
594     
595     my $instance = $self->instance_metaclass->new(
596         associated_metaclass => $self,
597         attributes => [ $self->get_all_attributes() ],
598     );
599
600     $self->add_meta_instance_dependencies()
601         if $instance->is_dependent_on_superclasses();
602
603     return $instance;
604 }
605
606 sub clone_object {
607     my $class    = shift;
608     my $instance = shift;
609     (blessed($instance) && $instance->isa($class->name))
610         || confess "You must pass an instance of the metaclass (" . (ref $class ? $class->name : $class) . "), not ($instance)";
611
612     # NOTE:
613     # we need to protect the integrity of the
614     # Class::MOP::Class singletons here, they
615     # should not be cloned.
616     return $instance if $instance->isa('Class::MOP::Class');
617     $class->_clone_instance($instance, @_);
618 }
619
620 sub _clone_instance {
621     my ($class, $instance, %params) = @_;
622     (blessed($instance))
623         || confess "You can only clone instances, ($instance) is not a blessed instance";
624     my $meta_instance = $class->get_meta_instance();
625     my $clone = $meta_instance->clone_instance($instance);
626     foreach my $attr ($class->get_all_attributes()) {
627         if ( defined( my $init_arg = $attr->init_arg ) ) {
628             if (exists $params{$init_arg}) {
629                 $attr->set_value($clone, $params{$init_arg});
630             }
631         }
632     }
633     return $clone;
634 }
635
636 sub rebless_instance {
637     my ($self, $instance, %params) = @_;
638
639     my $old_metaclass = Class::MOP::class_of($instance);
640
641     my $old_class = $old_metaclass ? $old_metaclass->name : blessed($instance);
642     $self->name->isa($old_class)
643         || confess "You may rebless only into a subclass of ($old_class), of which (". $self->name .") isn't.";
644
645     $old_metaclass->rebless_instance_away($instance, $self, %params)
646         if $old_metaclass;
647
648     my $meta_instance = $self->get_meta_instance();
649
650     # rebless!
651     # we use $_[1] here because of t/306_rebless_overload.t regressions on 5.8.8
652     $meta_instance->rebless_instance_structure($_[1], $self);
653
654     foreach my $attr ( $self->get_all_attributes ) {
655         if ( $attr->has_value($instance) ) {
656             if ( defined( my $init_arg = $attr->init_arg ) ) {
657                 $params{$init_arg} = $attr->get_value($instance)
658                     unless exists $params{$init_arg};
659             } 
660             else {
661                 $attr->set_value($instance, $attr->get_value($instance));
662             }
663         }
664     }
665
666     foreach my $attr ($self->get_all_attributes) {
667         $attr->initialize_instance_slot($meta_instance, $instance, \%params);
668     }
669     
670     $instance;
671 }
672
673 sub rebless_instance_back {
674     my ( $self, $instance ) = @_;
675
676     my $old_metaclass = Class::MOP::class_of($instance);
677
678     my $old_class
679         = $old_metaclass ? $old_metaclass->name : blessed($instance);
680     $old_class->isa( $self->name )
681         || confess
682         "You may rebless only into a superclass of ($old_class), of which ("
683         . $self->name
684         . ") isn't.";
685
686     $old_metaclass->rebless_instance_away( $instance, $self )
687         if $old_metaclass;
688
689     my $meta_instance = $self->get_meta_instance;
690
691     # we use $_[1] here because of t/306_rebless_overload.t regressions on 5.8.8
692     $meta_instance->rebless_instance_structure( $_[1], $self );
693
694     for my $attr ( $old_metaclass->get_all_attributes ) {
695         next if $self->has_attribute( $attr->name );
696         $meta_instance->deinitialize_slot( $instance, $_ ) for $attr->slots;
697     }
698
699     return $instance;
700 }
701
702 sub rebless_instance_away {
703     # this intentionally does nothing, it is just a hook
704 }
705
706 sub _attach_attribute {
707     my ($self, $attribute) = @_;
708     $attribute->attach_to_class($self);
709 }
710
711 sub _post_add_attribute {
712     my ( $self, $attribute ) = @_;
713
714     $self->invalidate_meta_instances;
715
716     # invalidate package flag here
717     try {
718         local $SIG{__DIE__};
719         $attribute->install_accessors;
720     }
721     catch {
722         $self->remove_attribute( $attribute->name );
723         die $_;
724     };
725 }
726
727 sub remove_attribute {
728     my $self = shift;
729
730     my $removed_attribute = $self->SUPER::remove_attribute(@_)
731         or return;
732
733     $self->invalidate_meta_instances;
734
735     $removed_attribute->remove_accessors;
736     $removed_attribute->detach_from_class;
737
738     return$removed_attribute;
739 }
740
741 sub find_attribute_by_name {
742     my ( $self, $attr_name ) = @_;
743
744     foreach my $class ( $self->linearized_isa ) {
745         # fetch the meta-class ...
746         my $meta = Class::MOP::Class->initialize($class);
747         return $meta->get_attribute($attr_name)
748             if $meta->has_attribute($attr_name);
749     }
750
751     return;
752 }
753
754 sub get_all_attributes {
755     my $self = shift;
756     my %attrs = map { %{ Class::MOP::Class->initialize($_)->_attribute_map } }
757         reverse $self->linearized_isa;
758     return values %attrs;
759 }
760
761 # Inheritance
762
763 sub superclasses {
764     my $self     = shift;
765     my $var_spec = { sigil => '@', type => 'ARRAY', name => 'ISA' };
766     if (@_) {
767         my @supers = @_;
768         @{$self->get_package_symbol($var_spec)} = @supers;
769
770         # NOTE:
771         # on 5.8 and below, we need to call
772         # a method to get Perl to detect
773         # a cycle in the class hierarchy
774         my $class = $self->name;
775         $class->isa($class);
776
777         # NOTE:
778         # we need to check the metaclass
779         # compatibility here so that we can
780         # be sure that the superclass is
781         # not potentially creating an issues
782         # we don't know about
783
784         $self->_check_metaclass_compatibility();
785         $self->_superclasses_updated();
786     }
787     @{$self->get_package_symbol($var_spec)};
788 }
789
790 sub _superclasses_updated {
791     my $self = shift;
792     $self->update_meta_instance_dependencies();
793 }
794
795 sub subclasses {
796     my $self = shift;
797     my $super_class = $self->name;
798
799     return @{ $super_class->mro::get_isarev() };
800 }
801
802 sub direct_subclasses {
803     my $self = shift;
804     my $super_class = $self->name;
805
806     return grep {
807         grep {
808             $_ eq $super_class
809         } Class::MOP::Class->initialize($_)->superclasses
810     } $self->subclasses;
811 }
812
813 sub linearized_isa {
814     return @{ mro::get_linear_isa( (shift)->name ) };
815 }
816
817 sub class_precedence_list {
818     my $self = shift;
819     my $name = $self->name;
820
821     unless (Class::MOP::IS_RUNNING_ON_5_10()) { 
822         # NOTE:
823         # We need to check for circular inheritance here
824         # if we are are not on 5.10, cause 5.8 detects it 
825         # late. This will do nothing if all is well, and 
826         # blow up otherwise. Yes, it's an ugly hack, better
827         # suggestions are welcome.        
828         # - SL
829         ($name || return)->isa('This is a test for circular inheritance') 
830     }
831
832     # if our mro is c3, we can 
833     # just grab the linear_isa
834     if (mro::get_mro($name) eq 'c3') {
835         return @{ mro::get_linear_isa($name) }
836     }
837     else {
838         # NOTE:
839         # we can't grab the linear_isa for dfs
840         # since it has all the duplicates 
841         # already removed.
842         return (
843             $name,
844             map {
845                 Class::MOP::Class->initialize($_)->class_precedence_list()
846             } $self->superclasses()
847         );
848     }
849 }
850
851 ## Methods
852
853 {
854     my $fetch_and_prepare_method = sub {
855         my ($self, $method_name) = @_;
856         my $wrapped_metaclass = $self->wrapped_method_metaclass;
857         # fetch it locally
858         my $method = $self->get_method($method_name);
859         # if we dont have local ...
860         unless ($method) {
861             # try to find the next method
862             $method = $self->find_next_method_by_name($method_name);
863             # die if it does not exist
864             (defined $method)
865                 || confess "The method '$method_name' was not found in the inheritance hierarchy for " . $self->name;
866             # and now make sure to wrap it
867             # even if it is already wrapped
868             # because we need a new sub ref
869             $method = $wrapped_metaclass->wrap($method,
870                 package_name => $self->name,
871                 name         => $method_name,
872             );
873         }
874         else {
875             # now make sure we wrap it properly
876             $method = $wrapped_metaclass->wrap($method,
877                 package_name => $self->name,
878                 name         => $method_name,
879             ) unless $method->isa($wrapped_metaclass);
880         }
881         $self->add_method($method_name => $method);
882         return $method;
883     };
884
885     sub add_before_method_modifier {
886         my ($self, $method_name, $method_modifier) = @_;
887         (defined $method_name && length $method_name)
888             || confess "You must pass in a method name";
889         my $method = $fetch_and_prepare_method->($self, $method_name);
890         $method->add_before_modifier(
891             subname(':before' => $method_modifier)
892         );
893     }
894
895     sub add_after_method_modifier {
896         my ($self, $method_name, $method_modifier) = @_;
897         (defined $method_name && length $method_name)
898             || confess "You must pass in a method name";
899         my $method = $fetch_and_prepare_method->($self, $method_name);
900         $method->add_after_modifier(
901             subname(':after' => $method_modifier)
902         );
903     }
904
905     sub add_around_method_modifier {
906         my ($self, $method_name, $method_modifier) = @_;
907         (defined $method_name && length $method_name)
908             || confess "You must pass in a method name";
909         my $method = $fetch_and_prepare_method->($self, $method_name);
910         $method->add_around_modifier(
911             subname(':around' => $method_modifier)
912         );
913     }
914
915     # NOTE:
916     # the methods above used to be named like this:
917     #    ${pkg}::${method}:(before|after|around)
918     # but this proved problematic when using one modifier
919     # to wrap multiple methods (something which is likely
920     # to happen pretty regularly IMO). So instead of naming
921     # it like this, I have chosen to just name them purely
922     # with their modifier names, like so:
923     #    :(before|after|around)
924     # The fact is that in a stack trace, it will be fairly
925     # evident from the context what method they are attached
926     # to, and so don't need the fully qualified name.
927 }
928
929 sub find_method_by_name {
930     my ($self, $method_name) = @_;
931     (defined $method_name && length $method_name)
932         || confess "You must define a method name to find";
933     foreach my $class ($self->linearized_isa) {
934         my $method = Class::MOP::Class->initialize($class)->get_method($method_name);
935         return $method if defined $method;
936     }
937     return;
938 }
939
940 sub get_all_methods {
941     my $self = shift;
942
943     my %methods;
944     for my $class ( reverse $self->linearized_isa ) {
945         my $meta = Class::MOP::Class->initialize($class);
946
947         $methods{$_} = $meta->get_method($_)
948             for $meta->get_method_list;
949     }
950
951     return values %methods;
952 }
953
954 sub get_all_method_names {
955     my $self = shift;
956     my %uniq;
957     return grep { !$uniq{$_}++ } map { Class::MOP::Class->initialize($_)->get_method_list } $self->linearized_isa;
958 }
959
960 sub find_all_methods_by_name {
961     my ($self, $method_name) = @_;
962     (defined $method_name && length $method_name)
963         || confess "You must define a method name to find";
964     my @methods;
965     foreach my $class ($self->linearized_isa) {
966         # fetch the meta-class ...
967         my $meta = Class::MOP::Class->initialize($class);
968         push @methods => {
969             name  => $method_name,
970             class => $class,
971             code  => $meta->get_method($method_name)
972         } if $meta->has_method($method_name);
973     }
974     return @methods;
975 }
976
977 sub find_next_method_by_name {
978     my ($self, $method_name) = @_;
979     (defined $method_name && length $method_name)
980         || confess "You must define a method name to find";
981     my @cpl = $self->linearized_isa;
982     shift @cpl; # discard ourselves
983     foreach my $class (@cpl) {
984         my $method = Class::MOP::Class->initialize($class)->get_method($method_name);
985         return $method if defined $method;
986     }
987     return;
988 }
989
990 sub update_meta_instance_dependencies {
991     my $self = shift;
992
993     if ( $self->{meta_instance_dependencies} ) {
994         return $self->add_meta_instance_dependencies;
995     }
996 }
997
998 sub add_meta_instance_dependencies {
999     my $self = shift;
1000
1001     $self->remove_meta_instance_dependencies;
1002
1003     my @attrs = $self->get_all_attributes();
1004
1005     my %seen;
1006     my @classes = grep { not $seen{ $_->name }++ }
1007         map { $_->associated_class } @attrs;
1008
1009     foreach my $class (@classes) {
1010         $class->add_dependent_meta_instance($self);
1011     }
1012
1013     $self->{meta_instance_dependencies} = \@classes;
1014 }
1015
1016 sub remove_meta_instance_dependencies {
1017     my $self = shift;
1018
1019     if ( my $classes = delete $self->{meta_instance_dependencies} ) {
1020         foreach my $class (@$classes) {
1021             $class->remove_dependent_meta_instance($self);
1022         }
1023
1024         return $classes;
1025     }
1026
1027     return;
1028
1029 }
1030
1031 sub add_dependent_meta_instance {
1032     my ( $self, $metaclass ) = @_;
1033     push @{ $self->{dependent_meta_instances} }, $metaclass;
1034 }
1035
1036 sub remove_dependent_meta_instance {
1037     my ( $self, $metaclass ) = @_;
1038     my $name = $metaclass->name;
1039     @$_ = grep { $_->name ne $name } @$_
1040         for $self->{dependent_meta_instances};
1041 }
1042
1043 sub invalidate_meta_instances {
1044     my $self = shift;
1045     $_->invalidate_meta_instance()
1046         for $self, @{ $self->{dependent_meta_instances} };
1047 }
1048
1049 sub invalidate_meta_instance {
1050     my $self = shift;
1051     undef $self->{_meta_instance};
1052 }
1053
1054 # check if we can reinitialize
1055 sub is_pristine {
1056     my $self = shift;
1057
1058     # if any local attr is defined
1059     return if $self->get_attribute_list;
1060
1061     # or any non-declared methods
1062     for my $method ( map { $self->get_method($_) } $self->get_method_list ) {
1063         return if $method->isa("Class::MOP::Method::Generated");
1064         # FIXME do we need to enforce this too? return unless $method->isa( $self->method_metaclass );
1065     }
1066
1067     return 1;
1068 }
1069
1070 ## Class closing
1071
1072 sub is_mutable   { 1 }
1073 sub is_immutable { 0 }
1074
1075 sub immutable_options { %{ $_[0]{__immutable}{options} || {} } }
1076
1077 sub _immutable_options {
1078     my ( $self, @args ) = @_;
1079
1080     return (
1081         inline_accessors   => 1,
1082         inline_constructor => 1,
1083         inline_destructor  => 0,
1084         debug              => 0,
1085         immutable_trait    => $self->immutable_trait,
1086         constructor_name   => $self->constructor_name,
1087         constructor_class  => $self->constructor_class,
1088         destructor_class   => $self->destructor_class,
1089         @args,
1090     );
1091 }
1092
1093 sub make_immutable {
1094     my ( $self, @args ) = @_;
1095
1096     if ( $self->is_mutable ) {
1097         $self->_initialize_immutable( $self->_immutable_options(@args) );
1098         $self->_rebless_as_immutable(@args);
1099         return $self;
1100     }
1101     else {
1102         return;
1103     }
1104 }
1105
1106 sub make_mutable {
1107     my $self = shift;
1108
1109     if ( $self->is_immutable ) {
1110         my @args = $self->immutable_options;
1111         $self->_rebless_as_mutable();
1112         $self->_remove_inlined_code(@args);
1113         delete $self->{__immutable};
1114         return $self;
1115     }
1116     else {
1117         return;
1118     }
1119 }
1120
1121 sub _rebless_as_immutable {
1122     my ( $self, @args ) = @_;
1123
1124     $self->{__immutable}{original_class} = ref $self;
1125
1126     bless $self => $self->_immutable_metaclass(@args);
1127 }
1128
1129 sub _immutable_metaclass {
1130     my ( $self, %args ) = @_;
1131
1132     if ( my $class = $args{immutable_metaclass} ) {
1133         return $class;
1134     }
1135
1136     my $trait = $args{immutable_trait} = $self->immutable_trait
1137         || confess "no immutable trait specified for $self";
1138
1139     my $meta      = $self->meta;
1140     my $meta_attr = $meta->find_attribute_by_name("immutable_trait");
1141
1142     my $class_name;
1143
1144     if ( $meta_attr and $trait eq $meta_attr->default ) {
1145         # if the trait is the same as the default we try and pick a
1146         # predictable name for the immutable metaclass
1147         $class_name = 'Class::MOP::Class::Immutable::' . ref($self);
1148     }
1149     else {
1150         $class_name = join '::', 'Class::MOP::Class::Immutable::CustomTrait',
1151             $trait, 'ForMetaClass', ref($self);
1152     }
1153
1154     return $class_name
1155         if Class::MOP::is_class_loaded($class_name);
1156
1157     # If the metaclass is a subclass of CMOP::Class which has had
1158     # metaclass roles applied (via Moose), then we want to make sure
1159     # that we preserve that anonymous class (see Fey::ORM for an
1160     # example of where this matters).
1161     my $meta_name = $meta->_real_ref_name;
1162
1163     my $immutable_meta = $meta_name->create(
1164         $class_name,
1165         superclasses => [ ref $self ],
1166     );
1167
1168     Class::MOP::load_class($trait);
1169     for my $meth ( Class::MOP::Class->initialize($trait)->get_all_methods ) {
1170         my $meth_name = $meth->name;
1171
1172         if ( $immutable_meta->find_method_by_name( $meth_name ) ) {
1173             $immutable_meta->add_around_method_modifier( $meth_name, $meth->body );
1174         }
1175         else {
1176             $immutable_meta->add_method( $meth_name, $meth->clone );
1177         }
1178     }
1179
1180     $immutable_meta->make_immutable(
1181         inline_constructor => 0,
1182         inline_accessors   => 0,
1183     );
1184
1185     return $class_name;
1186 }
1187
1188 sub _remove_inlined_code {
1189     my $self = shift;
1190
1191     $self->remove_method( $_->name ) for $self->_inlined_methods;
1192
1193     delete $self->{__immutable}{inlined_methods};
1194 }
1195
1196 sub _inlined_methods { @{ $_[0]{__immutable}{inlined_methods} || [] } }
1197
1198 sub _add_inlined_method {
1199     my ( $self, $method ) = @_;
1200
1201     push @{ $self->{__immutable}{inlined_methods} ||= [] }, $method;
1202 }
1203
1204 sub _initialize_immutable {
1205     my ( $self, %args ) = @_;
1206
1207     $self->{__immutable}{options} = \%args;
1208     $self->_install_inlined_code(%args);
1209 }
1210
1211 sub _install_inlined_code {
1212     my ( $self, %args ) = @_;
1213
1214     # FIXME
1215     $self->_inline_accessors(%args)   if $args{inline_accessors};
1216     $self->_inline_constructor(%args) if $args{inline_constructor};
1217     $self->_inline_destructor(%args)  if $args{inline_destructor};
1218 }
1219
1220 sub _rebless_as_mutable {
1221     my $self = shift;
1222
1223     bless $self, $self->_get_mutable_metaclass_name;
1224
1225     return $self;
1226 }
1227
1228 sub _inline_accessors {
1229     my $self = shift;
1230
1231     foreach my $attr_name ( $self->get_attribute_list ) {
1232         $self->get_attribute($attr_name)->install_accessors(1);
1233     }
1234 }
1235
1236 sub _inline_constructor {
1237     my ( $self, %args ) = @_;
1238
1239     my $name = $args{constructor_name};
1240     # A class may not even have a constructor, and that's okay.
1241     return unless defined $name;
1242
1243     if ( $self->has_method($name) && !$args{replace_constructor} ) {
1244         my $class = $self->name;
1245         warn "Not inlining a constructor for $class since it defines"
1246             . " its own constructor.\n"
1247             . "If you are certain you don't need to inline your"
1248             . " constructor, specify inline_constructor => 0 in your"
1249             . " call to $class->meta->make_immutable\n";
1250         return;
1251     }
1252
1253     my $constructor_class = $args{constructor_class};
1254
1255     Class::MOP::load_class($constructor_class);
1256
1257     my $constructor = $constructor_class->new(
1258         options      => \%args,
1259         metaclass    => $self,
1260         is_inline    => 1,
1261         package_name => $self->name,
1262         name         => $name,
1263     );
1264
1265     if ( $args{replace_constructor} or $constructor->can_be_inlined ) {
1266         $self->add_method( $name => $constructor );
1267         $self->_add_inlined_method($constructor);
1268     }
1269 }
1270
1271 sub _inline_destructor {
1272     my ( $self, %args ) = @_;
1273
1274     ( exists $args{destructor_class} && defined $args{destructor_class} )
1275         || confess "The 'inline_destructor' option is present, but "
1276         . "no destructor class was specified";
1277
1278     if ( $self->has_method('DESTROY') && ! $args{replace_destructor} ) {
1279         my $class = $self->name;
1280         warn "Not inlining a destructor for $class since it defines"
1281             . " its own destructor.\n";
1282         return;
1283     }
1284
1285     my $destructor_class = $args{destructor_class};
1286
1287     Class::MOP::load_class($destructor_class);
1288
1289     return unless $destructor_class->is_needed($self);
1290
1291     my $destructor = $destructor_class->new(
1292         options      => \%args,
1293         metaclass    => $self,
1294         package_name => $self->name,
1295         name         => 'DESTROY'
1296     );
1297
1298     if ( $args{replace_destructor} or $destructor->can_be_inlined ) {
1299         $self->add_method( 'DESTROY' => $destructor );
1300         $self->_add_inlined_method($destructor);
1301     }
1302 }
1303
1304 1;
1305
1306 __END__
1307
1308 =pod
1309
1310 =head1 NAME
1311
1312 Class::MOP::Class - Class Meta Object
1313
1314 =head1 SYNOPSIS
1315
1316   # assuming that class Foo
1317   # has been defined, you can
1318
1319   # use this for introspection ...
1320
1321   # add a method to Foo ...
1322   Foo->meta->add_method( 'bar' => sub {...} )
1323
1324   # get a list of all the classes searched
1325   # the method dispatcher in the correct order
1326   Foo->meta->class_precedence_list()
1327
1328   # remove a method from Foo
1329   Foo->meta->remove_method('bar');
1330
1331   # or use this to actually create classes ...
1332
1333   Class::MOP::Class->create(
1334       'Bar' => (
1335           version      => '0.01',
1336           superclasses => ['Foo'],
1337           attributes   => [
1338               Class::MOP::Attribute->new('$bar'),
1339               Class::MOP::Attribute->new('$baz'),
1340           ],
1341           methods => {
1342               calculate_bar => sub {...},
1343               construct_baz => sub {...}
1344           }
1345       )
1346   );
1347
1348 =head1 DESCRIPTION
1349
1350 The Class Protocol is the largest and most complex part of the
1351 Class::MOP meta-object protocol. It controls the introspection and
1352 manipulation of Perl 5 classes, and it can create them as well. The
1353 best way to understand what this module can do is to read the
1354 documentation for each of its methods.
1355
1356 =head1 INHERITANCE
1357
1358 C<Class::MOP::Class> is a subclass of L<Class::MOP::Module>.
1359
1360 =head1 METHODS
1361
1362 =head2 Class construction
1363
1364 These methods all create new C<Class::MOP::Class> objects. These
1365 objects can represent existing classes or they can be used to create
1366 new classes from scratch.
1367
1368 The metaclass object for a given class is a singleton. If you attempt
1369 to create a metaclass for the same class twice, you will just get the
1370 existing object.
1371
1372 =over 4
1373
1374 =item B<< Class::MOP::Class->create($package_name, %options) >>
1375
1376 This method creates a new C<Class::MOP::Class> object with the given
1377 package name. It accepts a number of options:
1378
1379 =over 8
1380
1381 =item * version
1382
1383 An optional version number for the newly created package.
1384
1385 =item * authority
1386
1387 An optional authority for the newly created package.
1388
1389 =item * superclasses
1390
1391 An optional array reference of superclass names.
1392
1393 =item * methods
1394
1395 An optional hash reference of methods for the class. The keys of the
1396 hash reference are method names and values are subroutine references.
1397
1398 =item * attributes
1399
1400 An optional array reference of L<Class::MOP::Attribute> objects.
1401
1402 =back
1403
1404 =item B<< Class::MOP::Class->create_anon_class(%options) >>
1405
1406 This method works just like C<< Class::MOP::Class->create >> but it
1407 creates an "anonymous" class. In fact, the class does have a name, but
1408 that name is a unique name generated internally by this module.
1409
1410 It accepts the same C<superclasses>, C<methods>, and C<attributes>
1411 parameters that C<create> accepts.
1412
1413 Anonymous classes are destroyed once the metaclass they are attached
1414 to goes out of scope, and will be removed from Perl's internal symbol
1415 table.
1416
1417 All instances of an anonymous class keep a special reference to the
1418 metaclass object, which prevents the metaclass from going out of scope
1419 while any instances exist.
1420
1421 This only works if the instance is based on a hash reference, however.
1422
1423 =item B<< Class::MOP::Class->initialize($package_name, %options) >>
1424
1425 This method will initialize a C<Class::MOP::Class> object for the
1426 named package. Unlike C<create>, this method I<will not> create a new
1427 class.
1428
1429 The purpose of this method is to retrieve a C<Class::MOP::Class>
1430 object for introspecting an existing class.
1431
1432 If an existing C<Class::MOP::Class> object exists for the named
1433 package, it will be returned, and any options provided will be
1434 ignored!
1435
1436 If the object does not yet exist, it will be created.
1437
1438 The valid options that can be passed to this method are
1439 C<attribute_metaclass>, C<method_metaclass>,
1440 C<wrapped_method_metaclass>, and C<instance_metaclass>. These are all
1441 optional, and default to the appropriate class in the C<Class::MOP>
1442 distribution.
1443
1444 =back
1445
1446 =head2 Object instance construction and cloning
1447
1448 These methods are all related to creating and/or cloning object
1449 instances.
1450
1451 =over 4
1452
1453 =item B<< $metaclass->clone_object($instance, %params) >>
1454
1455 This method clones an existing object instance. Any parameters you
1456 provide are will override existing attribute values in the object.
1457
1458 This is a convenience method for cloning an object instance, then
1459 blessing it into the appropriate package.
1460
1461 You could implement a clone method in your class, using this method:
1462
1463   sub clone {
1464       my ($self, %params) = @_;
1465       $self->meta->clone_object($self, %params);
1466   }
1467
1468 =item B<< $metaclass->rebless_instance($instance, %params) >>
1469
1470 This method changes the class of C<$instance> to the metaclass's class.
1471
1472 You can only rebless an instance into a subclass of its current
1473 class. If you pass any additional parameters, these will be treated
1474 like constructor parameters and used to initialize the object's
1475 attributes. Any existing attributes that are already set will be
1476 overwritten.
1477
1478 Before reblessing the instance, this method will call
1479 C<rebless_instance_away> on the instance's current metaclass. This method
1480 will be passed the instance, the new metaclass, and any parameters
1481 specified to C<rebless_instance>. By default, C<rebless_instance_away>
1482 does nothing; it is merely a hook.
1483
1484 =item B<< $metaclass->rebless_instance_back($instance) >>
1485
1486 Does the same thing as C<rebless_instance>, except that you can only
1487 rebless an instance into one of its superclasses. Any attributes that
1488 do not exist in the superclass will be deinitialized.
1489
1490 This is a much more dangerous operation than C<rebless_instance>,
1491 especially when multiple inheritance is involved, so use this carefully!
1492
1493 =item B<< $metaclass->new_object(%params) >>
1494
1495 This method is used to create a new object of the metaclass's
1496 class. Any parameters you provide are used to initialize the
1497 instance's attributes. A special C<__INSTANCE__> key can be passed to
1498 provide an already generated instance, rather than having Class::MOP
1499 generate it for you. This is mostly useful for using Class::MOP with
1500 foreign classes which generate instances using their own constructors.
1501
1502 =item B<< $metaclass->instance_metaclass >>
1503
1504 Returns the class name of the instance metaclass. See
1505 L<Class::MOP::Instance> for more information on the instance
1506 metaclass.
1507
1508 =item B<< $metaclass->get_meta_instance >>
1509
1510 Returns an instance of the C<instance_metaclass> to be used in the
1511 construction of a new instance of the class.
1512
1513 =back
1514
1515 =head2 Informational predicates
1516
1517 These are a few predicate methods for asking information about the
1518 class itself.
1519
1520 =over 4
1521
1522 =item B<< $metaclass->is_anon_class >>
1523
1524 This returns true if the class was created by calling C<<
1525 Class::MOP::Class->create_anon_class >>.
1526
1527 =item B<< $metaclass->is_mutable >>
1528
1529 This returns true if the class is still mutable.
1530
1531 =item B<< $metaclass->is_immutable >>
1532
1533 This returns true if the class has been made immutable.
1534
1535 =item B<< $metaclass->is_pristine >>
1536
1537 A class is I<not> pristine if it has non-inherited attributes or if it
1538 has any generated methods.
1539
1540 =back
1541
1542 =head2 Inheritance Relationships
1543
1544 =over 4
1545
1546 =item B<< $metaclass->superclasses(@superclasses) >>
1547
1548 This is a read-write accessor which represents the superclass
1549 relationships of the metaclass's class.
1550
1551 This is basically sugar around getting and setting C<@ISA>.
1552
1553 =item B<< $metaclass->class_precedence_list >>
1554
1555 This returns a list of all of the class's ancestor classes. The
1556 classes are returned in method dispatch order.
1557
1558 =item B<< $metaclass->linearized_isa >>
1559
1560 This returns a list based on C<class_precedence_list> but with all
1561 duplicates removed.
1562
1563 =item B<< $metaclass->subclasses >>
1564
1565 This returns a list of all subclasses for this class, even indirect
1566 subclasses.
1567
1568 =item B<< $metaclass->direct_subclasses >>
1569
1570 This returns a list of immediate subclasses for this class, which does not
1571 include indirect subclasses.
1572
1573 =back
1574
1575 =head2 Method introspection and creation
1576
1577 These methods allow you to introspect a class's methods, as well as
1578 add, remove, or change methods.
1579
1580 Determining what is truly a method in a Perl 5 class requires some
1581 heuristics (aka guessing).
1582
1583 Methods defined outside the package with a fully qualified name (C<sub
1584 Package::name { ... }>) will be included. Similarly, methods named
1585 with a fully qualified name using L<Sub::Name> are also included.
1586
1587 However, we attempt to ignore imported functions.
1588
1589 Ultimately, we are using heuristics to determine what truly is a
1590 method in a class, and these heuristics may get the wrong answer in
1591 some edge cases. However, for most "normal" cases the heuristics work
1592 correctly.
1593
1594 =over 4
1595
1596 =item B<< $metaclass->get_method($method_name) >>
1597
1598 This will return a L<Class::MOP::Method> for the specified
1599 C<$method_name>. If the class does not have the specified method, it
1600 returns C<undef>
1601
1602 =item B<< $metaclass->has_method($method_name) >>
1603
1604 Returns a boolean indicating whether or not the class defines the
1605 named method. It does not include methods inherited from parent
1606 classes.
1607
1608 =item B<< $metaclass->get_method_list >>
1609
1610 This will return a list of method I<names> for all methods defined in
1611 this class.
1612
1613 =item B<< $metaclass->add_method($method_name, $method) >>
1614
1615 This method takes a method name and a subroutine reference, and adds
1616 the method to the class.
1617
1618 The subroutine reference can be a L<Class::MOP::Method>, and you are
1619 strongly encouraged to pass a meta method object instead of a code
1620 reference. If you do so, that object gets stored as part of the
1621 class's method map directly. If not, the meta information will have to
1622 be recreated later, and may be incorrect.
1623
1624 If you provide a method object, this method will clone that object if
1625 the object's package name does not match the class name. This lets us
1626 track the original source of any methods added from other classes
1627 (notably Moose roles).
1628
1629 =item B<< $metaclass->remove_method($method_name) >>
1630
1631 Remove the named method from the class. This method returns the
1632 L<Class::MOP::Method> object for the method.
1633
1634 =item B<< $metaclass->method_metaclass >>
1635
1636 Returns the class name of the method metaclass, see
1637 L<Class::MOP::Method> for more information on the method metaclass.
1638
1639 =item B<< $metaclass->wrapped_method_metaclass >>
1640
1641 Returns the class name of the wrapped method metaclass, see
1642 L<Class::MOP::Method::Wrapped> for more information on the wrapped
1643 method metaclass.
1644
1645 =item B<< $metaclass->get_all_methods >>
1646
1647 This will traverse the inheritance hierarchy and return a list of all
1648 the L<Class::MOP::Method> objects for this class and its parents.
1649
1650 =item B<< $metaclass->find_method_by_name($method_name) >>
1651
1652 This will return a L<Class::MOP::Method> for the specified
1653 C<$method_name>. If the class does not have the specified method, it
1654 returns C<undef>
1655
1656 Unlike C<get_method>, this method I<will> look for the named method in
1657 superclasses.
1658
1659 =item B<< $metaclass->get_all_method_names >>
1660
1661 This will return a list of method I<names> for all of this class's
1662 methods, including inherited methods.
1663
1664 =item B<< $metaclass->find_all_methods_by_name($method_name) >>
1665
1666 This method looks for the named method in the class and all of its
1667 parents. It returns every matching method it finds in the inheritance
1668 tree, so it returns a list of methods.
1669
1670 Each method is returned as a hash reference with three keys. The keys
1671 are C<name>, C<class>, and C<code>. The C<code> key has a
1672 L<Class::MOP::Method> object as its value.
1673
1674 The list of methods is distinct.
1675
1676 =item B<< $metaclass->find_next_method_by_name($method_name) >>
1677
1678 This method returns the first method in any superclass matching the
1679 given name. It is effectively the method that C<SUPER::$method_name>
1680 would dispatch to.
1681
1682 =back
1683
1684 =head2 Attribute introspection and creation
1685
1686 Because Perl 5 does not have a core concept of attributes in classes,
1687 we can only return information about attributes which have been added
1688 via this class's methods. We cannot discover information about
1689 attributes which are defined in terms of "regular" Perl 5 methods.
1690
1691 =over 4
1692
1693 =item B<< $metaclass->get_attribute($attribute_name) >>
1694
1695 This will return a L<Class::MOP::Attribute> for the specified
1696 C<$attribute_name>. If the class does not have the specified
1697 attribute, it returns C<undef>.
1698
1699 NOTE that get_attribute does not search superclasses, for that you
1700 need to use C<find_attribute_by_name>.
1701
1702 =item B<< $metaclass->has_attribute($attribute_name) >>
1703
1704 Returns a boolean indicating whether or not the class defines the
1705 named attribute. It does not include attributes inherited from parent
1706 classes.
1707
1708 =item B<< $metaclass->get_attribute_list >>
1709
1710 This will return a list of attributes I<names> for all attributes
1711 defined in this class.  Note that this operates on the current class
1712 only, it does not traverse the inheritance hierarchy.
1713
1714 =item B<< $metaclass->get_all_attributes >>
1715
1716 This will traverse the inheritance hierarchy and return a list of all
1717 the L<Class::MOP::Attribute> objects for this class and its parents.
1718
1719 =item B<< $metaclass->find_attribute_by_name($attribute_name) >>
1720
1721 This will return a L<Class::MOP::Attribute> for the specified
1722 C<$attribute_name>. If the class does not have the specified
1723 attribute, it returns C<undef>.
1724
1725 Unlike C<get_attribute>, this attribute I<will> look for the named
1726 attribute in superclasses.
1727
1728 =item B<< $metaclass->add_attribute(...) >>
1729
1730 This method accepts either an existing L<Class::MOP::Attribute>
1731 object or parameters suitable for passing to that class's C<new>
1732 method.
1733
1734 The attribute provided will be added to the class.
1735
1736 Any accessor methods defined by the attribute will be added to the
1737 class when the attribute is added.
1738
1739 If an attribute of the same name already exists, the old attribute
1740 will be removed first.
1741
1742 =item B<< $metaclass->remove_attribute($attribute_name) >>
1743
1744 This will remove the named attribute from the class, and
1745 L<Class::MOP::Attribute> object.
1746
1747 Removing an attribute also removes any accessor methods defined by the
1748 attribute.
1749
1750 However, note that removing an attribute will only affect I<future>
1751 object instances created for this class, not existing instances.
1752
1753 =item B<< $metaclass->attribute_metaclass >>
1754
1755 Returns the class name of the attribute metaclass for this class. By
1756 default, this is L<Class::MOP::Attribute>.
1757
1758 =back
1759
1760 =head2 Class Immutability
1761
1762 Making a class immutable "freezes" the class definition. You can no
1763 longer call methods which alter the class, such as adding or removing
1764 methods or attributes.
1765
1766 Making a class immutable lets us optimize the class by inlining some
1767 methods, and also allows us to optimize some methods on the metaclass
1768 object itself.
1769
1770 After immutabilization, the metaclass object will cache most informational
1771 methods that returns information about methods or attributes. Methods which
1772 would alter the class, such as C<add_attribute> and C<add_method>, will
1773 throw an error on an immutable metaclass object.
1774
1775 The immutabilization system in L<Moose> takes much greater advantage
1776 of the inlining features than Class::MOP itself does.
1777
1778 =over 4
1779
1780 =item B<< $metaclass->make_immutable(%options) >>
1781
1782 This method will create an immutable transformer and use it to make
1783 the class and its metaclass object immutable.
1784
1785 This method accepts the following options:
1786
1787 =over 8
1788
1789 =item * inline_accessors
1790
1791 =item * inline_constructor
1792
1793 =item * inline_destructor
1794
1795 These are all booleans indicating whether the specified method(s)
1796 should be inlined.
1797
1798 By default, accessors and the constructor are inlined, but not the
1799 destructor.
1800
1801 =item * immutable_trait
1802
1803 The name of a class which will be used as a parent class for the
1804 metaclass object being made immutable. This "trait" implements the
1805 post-immutability functionality of the metaclass (but not the
1806 transformation itself).
1807
1808 This defaults to L<Class::MOP::Class::Immutable::Trait>.
1809
1810 =item * constructor_name
1811
1812 This is the constructor method name. This defaults to "new".
1813
1814 =item * constructor_class
1815
1816 The name of the method metaclass for constructors. It will be used to
1817 generate the inlined constructor. This defaults to
1818 "Class::MOP::Method::Constructor".
1819
1820 =item * replace_constructor
1821
1822 This is a boolean indicating whether an existing constructor should be
1823 replaced when inlining a constructor. This defaults to false.
1824
1825 =item * destructor_class
1826
1827 The name of the method metaclass for destructors. It will be used to
1828 generate the inlined destructor. This defaults to
1829 "Class::MOP::Method::Denstructor".
1830
1831 =item * replace_destructor
1832
1833 This is a boolean indicating whether an existing destructor should be
1834 replaced when inlining a destructor. This defaults to false.
1835
1836 =back
1837
1838 =item B<< $metaclass->immutable_options >>
1839
1840 Returns a hash of the options used when making the class immutable, including
1841 both defaults and anything supplied by the user in the call to C<<
1842 $metaclass->make_immutable >>. This is useful if you need to temporarily make
1843 a class mutable and then restore immutability as it was before.
1844
1845 =item B<< $metaclass->make_mutable >>
1846
1847 Calling this method reverse the immutabilization transformation.
1848
1849 =back
1850
1851 =head2 Method Modifiers
1852
1853 Method modifiers are hooks which allow a method to be wrapped with
1854 I<before>, I<after> and I<around> method modifiers. Every time a
1855 method is called, its modifiers are also called.
1856
1857 A class can modify its own methods, as well as methods defined in
1858 parent classes.
1859
1860 =head3 How method modifiers work?
1861
1862 Method modifiers work by wrapping the original method and then
1863 replacing it in the class's symbol table. The wrappers will handle
1864 calling all the modifiers in the appropriate order and preserving the
1865 calling context for the original method.
1866
1867 The return values of C<before> and C<after> modifiers are
1868 ignored. This is because their purpose is B<not> to filter the input
1869 and output of the primary method (this is done with an I<around>
1870 modifier).
1871
1872 This may seem like an odd restriction to some, but doing this allows
1873 for simple code to be added at the beginning or end of a method call
1874 without altering the function of the wrapped method or placing any
1875 extra responsibility on the code of the modifier.
1876
1877 Of course if you have more complex needs, you can use the C<around>
1878 modifier which allows you to change both the parameters passed to the
1879 wrapped method, as well as its return value.
1880
1881 Before and around modifiers are called in last-defined-first-called
1882 order, while after modifiers are called in first-defined-first-called
1883 order. So the call tree might looks something like this:
1884
1885   before 2
1886    before 1
1887     around 2
1888      around 1
1889       primary
1890      around 1
1891     around 2
1892    after 1
1893   after 2
1894
1895 =head3 What is the performance impact?
1896
1897 Of course there is a performance cost associated with method
1898 modifiers, but we have made every effort to make that cost directly
1899 proportional to the number of modifier features you use.
1900
1901 The wrapping method does its best to B<only> do as much work as it
1902 absolutely needs to. In order to do this we have moved some of the
1903 performance costs to set-up time, where they are easier to amortize.
1904
1905 All this said, our benchmarks have indicated the following:
1906
1907   simple wrapper with no modifiers             100% slower
1908   simple wrapper with simple before modifier   400% slower
1909   simple wrapper with simple after modifier    450% slower
1910   simple wrapper with simple around modifier   500-550% slower
1911   simple wrapper with all 3 modifiers          1100% slower
1912
1913 These numbers may seem daunting, but you must remember, every feature
1914 comes with some cost. To put things in perspective, just doing a
1915 simple C<AUTOLOAD> which does nothing but extract the name of the
1916 method called and return it costs about 400% over a normal method
1917 call.
1918
1919 =over 4
1920
1921 =item B<< $metaclass->add_before_method_modifier($method_name, $code) >>
1922
1923 This wraps the specified method with the supplied subroutine
1924 reference. The modifier will be called as a method itself, and will
1925 receive the same arguments as are passed to the method.
1926
1927 When the modifier exits, the wrapped method will be called.
1928
1929 The return value of the modifier will be ignored.
1930
1931 =item B<< $metaclass->add_after_method_modifier($method_name, $code) >>
1932
1933 This wraps the specified method with the supplied subroutine
1934 reference. The modifier will be called as a method itself, and will
1935 receive the same arguments as are passed to the method.
1936
1937 When the wrapped methods exits, the modifier will be called.
1938
1939 The return value of the modifier will be ignored.
1940
1941 =item B<< $metaclass->add_around_method_modifier($method_name, $code) >>
1942
1943 This wraps the specified method with the supplied subroutine
1944 reference.
1945
1946 The first argument passed to the modifier will be a subroutine
1947 reference to the wrapped method. The second argument is the object,
1948 and after that come any arguments passed when the method is called.
1949
1950 The around modifier can choose to call the original method, as well as
1951 what arguments to pass if it does so.
1952
1953 The return value of the modifier is what will be seen by the caller.
1954
1955 =back
1956
1957 =head2 Introspection
1958
1959 =over 4
1960
1961 =item B<< Class::MOP::Class->meta >>
1962
1963 This will return a L<Class::MOP::Class> instance for this class.
1964
1965 It should also be noted that L<Class::MOP> will actually bootstrap
1966 this module by installing a number of attribute meta-objects into its
1967 metaclass.
1968
1969 =back
1970
1971 =head1 AUTHORS
1972
1973 Stevan Little E<lt>stevan@iinteractive.comE<gt>
1974
1975 =head1 COPYRIGHT AND LICENSE
1976
1977 Copyright 2006-2010 by Infinity Interactive, Inc.
1978
1979 L<http://www.iinteractive.com>
1980
1981 This library is free software; you can redistribute it and/or modify
1982 it under the same terms as Perl itself.
1983
1984 =cut