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