Remove unnecessary calls of has_method()
[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         next if $immutable_meta->has_method( $meth_name );
1157
1158         if ( $immutable_meta->find_method_by_name( $meth_name ) ) {
1159             $immutable_meta->add_around_method_modifier( $meth_name, $meth->body );
1160         }
1161         else {
1162             $immutable_meta->add_method( $meth_name, $meth->clone );
1163         }
1164     }
1165
1166     $immutable_meta->make_immutable(
1167         inline_constructor => 0,
1168         inline_accessors   => 0,
1169     );
1170
1171     return $class_name;
1172 }
1173
1174 sub _remove_inlined_code {
1175     my $self = shift;
1176
1177     $self->remove_method( $_->name ) for $self->_inlined_methods;
1178
1179     delete $self->{__immutable}{inlined_methods};
1180 }
1181
1182 sub _inlined_methods { @{ $_[0]{__immutable}{inlined_methods} || [] } }
1183
1184 sub _add_inlined_method {
1185     my ( $self, $method ) = @_;
1186
1187     push @{ $self->{__immutable}{inlined_methods} ||= [] }, $method;
1188 }
1189
1190 sub _initialize_immutable {
1191     my ( $self, %args ) = @_;
1192
1193     $self->{__immutable}{options} = \%args;
1194     $self->_install_inlined_code(%args);
1195 }
1196
1197 sub _install_inlined_code {
1198     my ( $self, %args ) = @_;
1199
1200     # FIXME
1201     $self->_inline_accessors(%args)   if $args{inline_accessors};
1202     $self->_inline_constructor(%args) if $args{inline_constructor};
1203     $self->_inline_destructor(%args)  if $args{inline_destructor};
1204 }
1205
1206 sub _rebless_as_mutable {
1207     my $self = shift;
1208
1209     bless $self, $self->get_mutable_metaclass_name;
1210
1211     return $self;
1212 }
1213
1214 sub _inline_accessors {
1215     my $self = shift;
1216
1217     foreach my $attr_name ( $self->get_attribute_list ) {
1218         $self->get_attribute($attr_name)->install_accessors(1);
1219     }
1220 }
1221
1222 sub _inline_constructor {
1223     my ( $self, %args ) = @_;
1224
1225     my $name = $args{constructor_name};
1226
1227     if ( $self->has_method($name) && !$args{replace_constructor} ) {
1228         my $class = $self->name;
1229         warn "Not inlining a constructor for $class since it defines"
1230             . " its own constructor.\n"
1231             . "If you are certain you don't need to inline your"
1232             . " constructor, specify inline_constructor => 0 in your"
1233             . " call to $class->meta->make_immutable\n";
1234         return;
1235     }
1236
1237     my $constructor_class = $args{constructor_class};
1238
1239     Class::MOP::load_class($constructor_class);
1240
1241     my $constructor = $constructor_class->new(
1242         options      => \%args,
1243         metaclass    => $self,
1244         is_inline    => 1,
1245         package_name => $self->name,
1246         name         => $name,
1247     );
1248
1249     if ( $args{replace_constructor} or $constructor->can_be_inlined ) {
1250         $self->add_method( $name => $constructor );
1251         $self->_add_inlined_method($constructor);
1252     }
1253 }
1254
1255 sub _inline_destructor {
1256     my ( $self, %args ) = @_;
1257
1258     ( exists $args{destructor_class} && defined $args{destructor_class} )
1259         || confess "The 'inline_destructor' option is present, but "
1260         . "no destructor class was specified";
1261
1262     if ( $self->has_method('DESTROY') && ! $args{replace_destructor} ) {
1263         my $class = $self->name;
1264         warn "Not inlining a destructor for $class since it defines"
1265             . " its own destructor.\n";
1266         return;
1267     }
1268
1269     my $destructor_class = $args{destructor_class};
1270
1271     Class::MOP::load_class($destructor_class);
1272
1273     return unless $destructor_class->is_needed($self);
1274
1275     my $destructor = $destructor_class->new(
1276         options      => \%args,
1277         metaclass    => $self,
1278         package_name => $self->name,
1279         name         => 'DESTROY'
1280     );
1281
1282     if ( $args{replace_destructor} or $destructor->can_be_inlined ) {
1283         $self->add_method( 'DESTROY' => $destructor );
1284         $self->_add_inlined_method($destructor);
1285     }
1286 }
1287
1288 1;
1289
1290 __END__
1291
1292 =pod
1293
1294 =head1 NAME
1295
1296 Class::MOP::Class - Class Meta Object
1297
1298 =head1 SYNOPSIS
1299
1300   # assuming that class Foo
1301   # has been defined, you can
1302
1303   # use this for introspection ...
1304
1305   # add a method to Foo ...
1306   Foo->meta->add_method( 'bar' => sub {...} )
1307
1308   # get a list of all the classes searched
1309   # the method dispatcher in the correct order
1310   Foo->meta->class_precedence_list()
1311
1312   # remove a method from Foo
1313   Foo->meta->remove_method('bar');
1314
1315   # or use this to actually create classes ...
1316
1317   Class::MOP::Class->create(
1318       'Bar' => (
1319           version      => '0.01',
1320           superclasses => ['Foo'],
1321           attributes   => [
1322               Class::MOP::Attribute->new('$bar'),
1323               Class::MOP::Attribute->new('$baz'),
1324           ],
1325           methods => {
1326               calculate_bar => sub {...},
1327               construct_baz => sub {...}
1328           }
1329       )
1330   );
1331
1332 =head1 DESCRIPTION
1333
1334 The Class Protocol is the largest and most complex part of the
1335 Class::MOP meta-object protocol. It controls the introspection and
1336 manipulation of Perl 5 classes, and it can create them as well. The
1337 best way to understand what this module can do, is to read the
1338 documentation for each of its methods.
1339
1340 =head1 INHERITANCE
1341
1342 C<Class::MOP::Class> is a subclass of L<Class::MOP::Module>.
1343
1344 =head1 METHODS
1345
1346 =head2 Class construction
1347
1348 These methods all create new C<Class::MOP::Class> objects. These
1349 objects can represent existing classes, or they can be used to create
1350 new classes from scratch.
1351
1352 The metaclass object for a given class is a singleton. If you attempt
1353 to create a metaclass for the same class twice, you will just get the
1354 existing object.
1355
1356 =over 4
1357
1358 =item B<< Class::MOP::Class->create($package_name, %options) >>
1359
1360 This method creates a new C<Class::MOP::Class> object with the given
1361 package name. It accepts a number of options.
1362
1363 =over 8
1364
1365 =item * version
1366
1367 An optional version number for the newly created package.
1368
1369 =item * authority
1370
1371 An optional authority for the newly created package.
1372
1373 =item * superclasses
1374
1375 An optional array reference of superclass names.
1376
1377 =item * methods
1378
1379 An optional hash reference of methods for the class. The keys of the
1380 hash reference are method names, and values are subroutine references.
1381
1382 =item * attributes
1383
1384 An optional array reference of L<Class::MOP::Attribute> objects.
1385
1386 =back
1387
1388 =item B<< Class::MOP::Class->create_anon_class(%options) >>
1389
1390 This method works just like C<< Class::MOP::Class->create >> but it
1391 creates an "anonymous" class. In fact, the class does have a name, but
1392 that name is a unique name generated internally by this module.
1393
1394 It accepts the same C<superclasses>, C<methods>, and C<attributes>
1395 parameters that C<create> accepts.
1396
1397 Anonymous classes are destroyed once the metaclass they are attached
1398 to goes out of scope, and will be removed from Perl's internal symbol
1399 table.
1400
1401 All instances of an anonymous class keep a special reference to the
1402 metaclass object, which prevents the metaclass from going out of scope
1403 while any instances exist.
1404
1405 This only works if the instance if based on a hash reference, however.
1406
1407 =item B<< Class::MOP::Class->initialize($package_name, %options) >>
1408
1409 This method will initialize a C<Class::MOP::Class> object for the
1410 named package. Unlike C<create>, this method I<will not> create a new
1411 class.
1412
1413 The purpose of this method is to retrieve a C<Class::MOP::Class>
1414 object for introspecting an existing class.
1415
1416 If an existing C<Class::MOP::Class> object exists for the named
1417 package, it will be returned, and any options provided will be
1418 ignored!
1419
1420 If the object does not yet exist, it will be created.
1421
1422 The valid options that can be passed to this method are
1423 C<attribute_metaclass>, C<method_metaclass>,
1424 C<wrapped_method_metaclass>, and C<instance_metaclass>. These are all
1425 optional, and default to the appropriate class in the C<Class::MOP>
1426 distribution.
1427
1428 =back
1429
1430 =head2 Object instance construction and cloning
1431
1432 These methods are all related to creating and/or cloning object
1433 instances.
1434
1435 =over 4
1436
1437 =item B<< $metaclass->clone_object($instance, %params) >>
1438
1439 This method clones an existing object instance. Any parameters you
1440 provide are will override existing attribute values in the object.
1441
1442 This is a convenience method for cloning an object instance, then
1443 blessing it into the appropriate package.
1444
1445 You could implement a clone method in your class, using this method:
1446
1447   sub clone {
1448       my ($self, %params) = @_;
1449       $self->meta->clone_object($self, %params);
1450   }
1451
1452 =item B<< $metaclass->rebless_instance($instance, %params) >>
1453
1454 This method changes the class of C<$instance> to the metaclass's class.
1455
1456 You can only rebless an instance into a subclass of its current
1457 class. If you pass any additional parameters, these will be treated
1458 like constructor parameters and used to initialize the object's
1459 attributes. Any existing attributes that are already set will be
1460 overwritten.
1461
1462 Before reblessing the instance, this method will call
1463 C<rebless_instance_away> on the instance's current metaclass. This method
1464 will be passed the instance, the new metaclass, and any parameters
1465 specified to C<rebless_instance>. By default, C<rebless_instance_away>
1466 does nothing; it is merely a hook.
1467
1468 =item B<< $metaclass->new_object(%params) >>
1469
1470 This method is used to create a new object of the metaclass's
1471 class. Any parameters you provide are used to initialize the
1472 instance's attributes. A special C<__INSTANCE__> key can be passed to
1473 provide an already generated instance, rather than having Class::MOP
1474 generate it for you. This is mostly useful for using Class::MOP with
1475 foreign classes, which generally generate instances using their own
1476 constructor.
1477
1478 =item B<< $metaclass->instance_metaclass >>
1479
1480 Returns the class name of the instance metaclass, see
1481 L<Class::MOP::Instance> for more information on the instance
1482 metaclass.
1483
1484 =item B<< $metaclass->get_meta_instance >>
1485
1486 Returns an instance of the C<instance_metaclass> to be used in the
1487 construction of a new instance of the class.
1488
1489 =back
1490
1491 =head2 Informational predicates
1492
1493 These are a few predicate methods for asking information about the
1494 class itself.
1495
1496 =over 4
1497
1498 =item B<< $metaclass->is_anon_class >>
1499
1500 This returns true if the class was created by calling C<<
1501 Class::MOP::Class->create_anon_class >>.
1502
1503 =item B<< $metaclass->is_mutable >>
1504
1505 This returns true if the class is still mutable.
1506
1507 =item B<< $metaclass->is_immutable >>
1508
1509 This returns true if the class has been made immutable.
1510
1511 =item B<< $metaclass->is_pristine >>
1512
1513 A class is I<not> pristine if it has non-inherited attributes or if it
1514 has any generated methods.
1515
1516 =back
1517
1518 =head2 Inheritance Relationships
1519
1520 =over 4
1521
1522 =item B<< $metaclass->superclasses(@superclasses) >>
1523
1524 This is a read-write accessor which represents the superclass
1525 relationships of the metaclass's class.
1526
1527 This is basically sugar around getting and setting C<@ISA>.
1528
1529 =item B<< $metaclass->class_precedence_list >>
1530
1531 This returns a list of all of the class's ancestor classes. The
1532 classes are returned in method dispatch order.
1533
1534 =item B<< $metaclass->linearized_isa >>
1535
1536 This returns a list based on C<class_precedence_list> but with all
1537 duplicates removed.
1538
1539 =item B<< $metaclass->subclasses >>
1540
1541 This returns a list of all subclasses for this class, even indirect
1542 subclasses.
1543
1544 =item B<< $metaclass->direct_subclasses >>
1545
1546 This returns a list of immediate subclasses for this class, which does not
1547 include indirect subclasses.
1548
1549 =back
1550
1551 =head2 Method introspection and creation
1552
1553 These methods allow you to introspect a class's methods, as well as
1554 add, remove, or change methods.
1555
1556 Determining what is truly a method in a Perl 5 class requires some
1557 heuristics (aka guessing).
1558
1559 Methods defined outside the package with a fully qualified name (C<sub
1560 Package::name { ... }>) will be included. Similarly, methods named
1561 with a fully qualified name using L<Sub::Name> are also included.
1562
1563 However, we attempt to ignore imported functions.
1564
1565 Ultimately, we are using heuristics to determine what truly is a
1566 method in a class, and these heuristics may get the wrong answer in
1567 some edge cases. However, for most "normal" cases the heuristics work
1568 correctly.
1569
1570 =over 4
1571
1572 =item B<< $metaclass->get_method($method_name) >>
1573
1574 This will return a L<Class::MOP::Method> for the specified
1575 C<$method_name>. If the class does not have the specified method, it
1576 returns C<undef>
1577
1578 =item B<< $metaclass->has_method($method_name) >>
1579
1580 Returns a boolean indicating whether or not the class defines the
1581 named method. It does not include methods inherited from parent
1582 classes.
1583
1584 =item B<< $metaclass->get_method_map >>
1585
1586 Returns a hash reference representing the methods defined in this
1587 class. The keys are method names and the values are
1588 L<Class::MOP::Method> objects.
1589
1590 =item B<< $metaclass->get_method_list >>
1591
1592 This will return a list of method I<names> for all methods defined in
1593 this class.
1594
1595 =item B<< $metaclass->get_all_methods >>
1596
1597 This will traverse the inheritance hierarchy and return a list of all
1598 the L<Class::MOP::Method> objects for this class and its parents.
1599
1600 =item B<< $metaclass->find_method_by_name($method_name) >>
1601
1602 This will return a L<Class::MOP::Method> for the specified
1603 C<$method_name>. If the class does not have the specified method, it
1604 returns C<undef>
1605
1606 Unlike C<get_method>, this method I<will> look for the named method in
1607 superclasses.
1608
1609 =item B<< $metaclass->get_all_method_names >>
1610
1611 This will return a list of method I<names> for all of this class's
1612 methods, including inherited methods.
1613
1614 =item B<< $metaclass->find_all_methods_by_name($method_name) >>
1615
1616 This method looks for the named method in the class and all of its
1617 parents. It returns every matching method it finds in the inheritance
1618 tree, so it returns a list of methods.
1619
1620 Each method is returned as a hash reference with three keys. The keys
1621 are C<name>, C<class>, and C<code>. The C<code> key has a
1622 L<Class::MOP::Method> object as its value.
1623
1624 The list of methods is distinct.
1625
1626 =item B<< $metaclass->find_next_method_by_name($method_name) >>
1627
1628 This method returns the first method in any superclass matching the
1629 given name. It is effectively the method that C<SUPER::$method_name>
1630 would dispatch to.
1631
1632 =item B<< $metaclass->add_method($method_name, $method) >>
1633
1634 This method takes a method name and a subroutine reference, and adds
1635 the method to the class.
1636
1637 The subroutine reference can be a L<Class::MOP::Method>, and you are
1638 strongly encouraged to pass a meta method object instead of a code
1639 reference. If you do so, that object gets stored as part of the
1640 class's method map directly. If not, the meta information will have to
1641 be recreated later, and may be incorrect.
1642
1643 If you provide a method object, this method will clone that object if
1644 the object's package name does not match the class name. This lets us
1645 track the original source of any methods added from other classes
1646 (notably Moose roles).
1647
1648 =item B<< $metaclass->remove_method($method_name) >>
1649
1650 Remove the named method from the class. This method returns the
1651 L<Class::MOP::Method> object for the method.
1652
1653 =item B<< $metaclass->method_metaclass >>
1654
1655 Returns the class name of the method metaclass, see
1656 L<Class::MOP::Method> for more information on the method metaclass.
1657
1658 =item B<< $metaclass->wrapped_method_metaclass >>
1659
1660 Returns the class name of the wrapped method metaclass, see
1661 L<Class::MOP::Method::Wrapped> for more information on the wrapped
1662 method metaclass.
1663
1664 =back
1665
1666 =head2 Attribute introspection and creation
1667
1668 Because Perl 5 does not have a core concept of attributes in classes,
1669 we can only return information about attributes which have been added
1670 via this class's methods. We cannot discover information about
1671 attributes which are defined in terms of "regular" Perl 5 methods.
1672
1673 =over 4
1674
1675 =item B<< $metaclass->get_attribute($attribute_name) >>
1676
1677 This will return a L<Class::MOP::Attribute> for the specified
1678 C<$attribute_name>. If the class does not have the specified
1679 attribute, it returns C<undef>.
1680
1681 NOTE that get_attribute does not search superclasses, for that you
1682 need to use C<find_attribute_by_name>.
1683
1684 =item B<< $metaclass->has_attribute($attribute_name) >>
1685
1686 Returns a boolean indicating whether or not the class defines the
1687 named attribute. It does not include attributes inherited from parent
1688 classes.
1689
1690 =item B<< $metaclass->get_attribute_map >>
1691
1692 Returns a hash reference representing the attributes defined in this
1693 class. The keys are attribute names and the values are
1694 L<Class::MOP::Attribute> objects.
1695
1696 =item B<< $metaclass->get_attribute_list >>
1697
1698 This will return a list of attributes I<names> for all attributes
1699 defined in this class.
1700
1701 =item B<< $metaclass->get_all_attributes >>
1702
1703 This will traverse the inheritance hierarchy and return a list of all
1704 the L<Class::MOP::Attribute> objects for this class and its parents.
1705
1706 =item B<< $metaclass->find_attribute_by_name($attribute_name) >>
1707
1708 This will return a L<Class::MOP::Attribute> for the specified
1709 C<$attribute_name>. If the class does not have the specified
1710 attribute, it returns C<undef>
1711
1712 Unlike C<get_attribute>, this attribute I<will> look for the named
1713 attribute in superclasses.
1714
1715 =item B<< $metaclass->add_attribute(...) >>
1716
1717 This method accepts either an existing L<Class::MOP::Attribute>
1718 object, or parameters suitable for passing to that class's C<new>
1719 method.
1720
1721 The attribute provided will be added to the class.
1722
1723 Any accessor methods defined by the attribute will be added to the
1724 class when the attribute is added.
1725
1726 If an attribute of the same name already exists, the old attribute
1727 will be removed first.
1728
1729 =item B<< $metaclass->remove_attribute($attribute_name) >>
1730
1731 This will remove the named attribute from the class, and
1732 L<Class::MOP::Attribute> object.
1733
1734 Removing an attribute also removes any accessor methods defined by the
1735 attribute.
1736
1737 However, note that removing an attribute will only affect I<future>
1738 object instances created for this class, not existing instances.
1739
1740 =item B<< $metaclass->attribute_metaclass >>
1741
1742 Returns the class name of the attribute metaclass for this class. By
1743 default, this is L<Class::MOP::Attribute>.  for more information on
1744
1745 =back
1746
1747 =head2 Class Immutability
1748
1749 Making a class immutable "freezes" the class definition. You can no
1750 longer call methods which alter the class, such as adding or removing
1751 methods or attributes.
1752
1753 Making a class immutable lets us optimize the class by inlining some
1754 methods, and also allows us to optimize some methods on the metaclass
1755 object itself.
1756
1757 After immutabilization, the metaclass object will cache most
1758 informational methods such as C<get_method_map> and
1759 C<get_all_attributes>. Methods which would alter the class, such as
1760 C<add_attribute>, C<add_method>, and so on will throw an error on an
1761 immutable metaclass object.
1762
1763 The immutabilization system in L<Moose> takes much greater advantage
1764 of the inlining features than Class::MOP itself does.
1765
1766 =over 4
1767
1768 =item B<< $metaclass->make_immutable(%options) >>
1769
1770 This method will create an immutable transformer and uses it to make
1771 the class and its metaclass object immutable.
1772
1773 This method accepts the following options:
1774
1775 =over 8
1776
1777 =item * inline_accessors
1778
1779 =item * inline_constructor
1780
1781 =item * inline_destructor
1782
1783 These are all booleans indicating whether the specified method(s)
1784 should be inlined.
1785
1786 By default, accessors and the constructor are inlined, but not the
1787 destructor.
1788
1789 =item * immutable_trait
1790
1791 The name of a class which will be used as a parent class for the
1792 metaclass object being made immutable. This "trait" implements the
1793 post-immutability functionality of the metaclass (but not the
1794 transformation itself).
1795
1796 This defaults to L<Class::MOP::Class::Immutable::Trait>.
1797
1798 =item * constructor_name
1799
1800 This is the constructor method name. This defaults to "new".
1801
1802 =item * constructor_class
1803
1804 The name of the method metaclass for constructors. It will be used to
1805 generate the inlined constructor. This defaults to
1806 "Class::MOP::Method::Constructor".
1807
1808 =item * replace_constructor
1809
1810 This is a boolean indicating whether an existing constructor should be
1811 replaced when inlining a constructor. This defaults to false.
1812
1813 =item * destructor_class
1814
1815 The name of the method metaclass for destructors. It will be used to
1816 generate the inlined destructor. This defaults to
1817 "Class::MOP::Method::Denstructor".
1818
1819 =item * replace_destructor
1820
1821 This is a boolean indicating whether an existing destructor should be
1822 replaced when inlining a destructor. This defaults to false.
1823
1824 =back
1825
1826 =item B<< $metaclass->make_mutable >>
1827
1828 Calling this method reverse the immutabilization transformation.
1829
1830 =back
1831
1832 =head2 Method Modifiers
1833
1834 Method modifiers are hooks which allow a method to be wrapped with
1835 I<before>, I<after> and I<around> method modifiers. Every time a
1836 method is called, it's modifiers are also called.
1837
1838 A class can modify its own methods, as well as methods defined in
1839 parent classes.
1840
1841 =head3 How method modifiers work?
1842
1843 Method modifiers work by wrapping the original method and then
1844 replacing it in the class's symbol table. The wrappers will handle
1845 calling all the modifiers in the appropriate order and preserving the
1846 calling context for the original method.
1847
1848 The return values of C<before> and C<after> modifiers are
1849 ignored. This is because their purpose is B<not> to filter the input
1850 and output of the primary method (this is done with an I<around>
1851 modifier).
1852
1853 This may seem like an odd restriction to some, but doing this allows
1854 for simple code to be added at the beginning or end of a method call
1855 without altering the function of the wrapped method or placing any
1856 extra responsibility on the code of the modifier.
1857
1858 Of course if you have more complex needs, you can use the C<around>
1859 modifier which allows you to change both the parameters passed to the
1860 wrapped method, as well as its return value.
1861
1862 Before and around modifiers are called in last-defined-first-called
1863 order, while after modifiers are called in first-defined-first-called
1864 order. So the call tree might looks something like this:
1865
1866   before 2
1867    before 1
1868     around 2
1869      around 1
1870       primary
1871      around 1
1872     around 2
1873    after 1
1874   after 2
1875
1876 =head3 What is the performance impact?
1877
1878 Of course there is a performance cost associated with method
1879 modifiers, but we have made every effort to make that cost directly
1880 proportional to the number of modifier features you utilize.
1881
1882 The wrapping method does it's best to B<only> do as much work as it
1883 absolutely needs to. In order to do this we have moved some of the
1884 performance costs to set-up time, where they are easier to amortize.
1885
1886 All this said, our benchmarks have indicated the following:
1887
1888   simple wrapper with no modifiers             100% slower
1889   simple wrapper with simple before modifier   400% slower
1890   simple wrapper with simple after modifier    450% slower
1891   simple wrapper with simple around modifier   500-550% slower
1892   simple wrapper with all 3 modifiers          1100% slower
1893
1894 These numbers may seem daunting, but you must remember, every feature
1895 comes with some cost. To put things in perspective, just doing a
1896 simple C<AUTOLOAD> which does nothing but extract the name of the
1897 method called and return it costs about 400% over a normal method
1898 call.
1899
1900 =over 4
1901
1902 =item B<< $metaclass->add_before_method_modifier($method_name, $code) >>
1903
1904 This wraps the specified method with the supplied subroutine
1905 reference. The modifier will be called as a method itself, and will
1906 receive the same arguments as are passed to the method.
1907
1908 When the modifier exits, the wrapped method will be called.
1909
1910 The return value of the modifier will be ignored.
1911
1912 =item B<< $metaclass->add_after_method_modifier($method_name, $code) >>
1913
1914 This wraps the specified method with the supplied subroutine
1915 reference. The modifier will be called as a method itself, and will
1916 receive the same arguments as are passed to the method.
1917
1918 When the wrapped methods exits, the modifier will be called.
1919
1920 The return value of the modifier will be ignored.
1921
1922 =item B<< $metaclass->add_around_method_modifier($method_name, $code) >>
1923
1924 This wraps the specified method with the supplied subroutine
1925 reference.
1926
1927 The first argument passed to the modifier will be a subroutine
1928 reference to the wrapped method. The second argument is the object,
1929 and after that come any arguments passed when the method is called.
1930
1931 The around modifier can choose to call the original method, as well as
1932 what arguments to pass if it does so.
1933
1934 The return value of the modifier is what will be seen by the caller.
1935
1936 =back
1937
1938 =head2 Introspection
1939
1940 =over 4
1941
1942 =item B<< Class::MOP::Class->meta >>
1943
1944 This will return a L<Class::MOP::Class> instance for this class.
1945
1946 It should also be noted that L<Class::MOP> will actually bootstrap
1947 this module by installing a number of attribute meta-objects into its
1948 metaclass.
1949
1950 =back
1951
1952 =head1 AUTHORS
1953
1954 Stevan Little E<lt>stevan@iinteractive.comE<gt>
1955
1956 =head1 COPYRIGHT AND LICENSE
1957
1958 Copyright 2006-2009 by Infinity Interactive, Inc.
1959
1960 L<http://www.iinteractive.com>
1961
1962 This library is free software; you can redistribute it and/or modify
1963 it under the same terms as Perl itself.
1964
1965 =cut