df62de7a5e12276baf51c4f47721634143649d85
[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.91';
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                 package_name => $self->name,
667                 name         => $method_name,
668             );
669         }
670         else {
671             # now make sure we wrap it properly
672             $method = $wrapped_metaclass->wrap($method,
673                 package_name => $self->name,
674                 name         => $method_name,
675             ) unless $method->isa($wrapped_metaclass);
676         }
677         $self->add_method($method_name => $method);
678         return $method;
679     };
680
681     sub add_before_method_modifier {
682         my ($self, $method_name, $method_modifier) = @_;
683         (defined $method_name && $method_name)
684             || confess "You must pass in a method name";
685         my $method = $fetch_and_prepare_method->($self, $method_name);
686         $method->add_before_modifier(
687             subname(':before' => $method_modifier)
688         );
689     }
690
691     sub add_after_method_modifier {
692         my ($self, $method_name, $method_modifier) = @_;
693         (defined $method_name && $method_name)
694             || confess "You must pass in a method name";
695         my $method = $fetch_and_prepare_method->($self, $method_name);
696         $method->add_after_modifier(
697             subname(':after' => $method_modifier)
698         );
699     }
700
701     sub add_around_method_modifier {
702         my ($self, $method_name, $method_modifier) = @_;
703         (defined $method_name && $method_name)
704             || confess "You must pass in a method name";
705         my $method = $fetch_and_prepare_method->($self, $method_name);
706         $method->add_around_modifier(
707             subname(':around' => $method_modifier)
708         );
709     }
710
711     # NOTE:
712     # the methods above used to be named like this:
713     #    ${pkg}::${method}:(before|after|around)
714     # but this proved problematic when using one modifier
715     # to wrap multiple methods (something which is likely
716     # to happen pretty regularly IMO). So instead of naming
717     # it like this, I have chosen to just name them purely
718     # with their modifier names, like so:
719     #    :(before|after|around)
720     # The fact is that in a stack trace, it will be fairly
721     # evident from the context what method they are attached
722     # to, and so don't need the fully qualified name.
723 }
724
725 sub alias_method {
726     Carp::cluck("The alias_method method is deprecated. Use add_method instead.\n");
727
728     shift->add_method(@_);
729 }
730
731 sub _code_is_mine {
732     my ( $self, $code ) = @_;
733
734     my ( $code_package, $code_name ) = Class::MOP::get_code_info($code);
735
736     return $code_package && $code_package eq $self->name
737         || ( $code_package eq 'constant' && $code_name eq '__ANON__' );
738 }
739
740 sub has_method {
741     my ($self, $method_name) = @_;
742     (defined $method_name && $method_name)
743         || confess "You must define a method name";
744
745     return defined($self->get_method($method_name));
746 }
747
748 sub get_method {
749     my ($self, $method_name) = @_;
750     (defined $method_name && $method_name)
751         || confess "You must define a method name";
752
753     my $method_map    = $self->_method_map;
754     my $method_object = $method_map->{$method_name};
755     my $code = $self->get_package_symbol({
756         name  => $method_name,
757         sigil => '&',
758         type  => 'CODE',
759     });
760
761     unless ( $method_object && $method_object->body == ( $code || 0 ) ) {
762         if ( $code && $self->_code_is_mine($code) ) {
763             $method_object = $method_map->{$method_name}
764                 = $self->wrap_method_body(
765                 body                 => $code,
766                 name                 => $method_name,
767                 associated_metaclass => $self,
768                 );
769         }
770         else {
771             delete $method_map->{$method_name};
772             return undef;
773         }
774     }
775
776     return $method_object;
777 }
778
779 sub remove_method {
780     my ($self, $method_name) = @_;
781     (defined $method_name && $method_name)
782         || confess "You must define a method name";
783
784     my $removed_method = delete $self->get_method_map->{$method_name};
785     
786     $self->remove_package_symbol(
787         { sigil => '&', type => 'CODE', name => $method_name }
788     );
789
790     $removed_method->detach_from_class if $removed_method;
791
792     $self->update_package_cache_flag; # still valid, since we just removed the method from the map
793
794     return $removed_method;
795 }
796
797 sub get_method_list {
798     my $self = shift;
799     return grep { $self->has_method($_) } keys %{ $self->namespace };
800 }
801
802 sub find_method_by_name {
803     my ($self, $method_name) = @_;
804     (defined $method_name && $method_name)
805         || confess "You must define a method name to find";
806     foreach my $class ($self->linearized_isa) {
807         my $method = $self->initialize($class)->get_method($method_name);
808         return $method if defined $method;
809     }
810     return;
811 }
812
813 sub get_all_methods {
814     my $self = shift;
815     my %methods = map { %{ $self->initialize($_)->get_method_map } } reverse $self->linearized_isa;
816     return values %methods;
817 }
818
819 sub compute_all_applicable_methods {
820     Carp::cluck('The compute_all_applicable_methods method is deprecated.'
821         . " Use get_all_methods instead.\n");
822
823     return map {
824         {
825             name  => $_->name,
826             class => $_->package_name,
827             code  => $_, # sigh, overloading
828         },
829     } shift->get_all_methods(@_);
830 }
831
832 sub get_all_method_names {
833     my $self = shift;
834     my %uniq;
835     return grep { !$uniq{$_}++ } map { $self->initialize($_)->get_method_list } $self->linearized_isa;
836 }
837
838 sub find_all_methods_by_name {
839     my ($self, $method_name) = @_;
840     (defined $method_name && $method_name)
841         || confess "You must define a method name to find";
842     my @methods;
843     foreach my $class ($self->linearized_isa) {
844         # fetch the meta-class ...
845         my $meta = $self->initialize($class);
846         push @methods => {
847             name  => $method_name,
848             class => $class,
849             code  => $meta->get_method($method_name)
850         } if $meta->has_method($method_name);
851     }
852     return @methods;
853 }
854
855 sub find_next_method_by_name {
856     my ($self, $method_name) = @_;
857     (defined $method_name && $method_name)
858         || confess "You must define a method name to find";
859     my @cpl = $self->linearized_isa;
860     shift @cpl; # discard ourselves
861     foreach my $class (@cpl) {
862         my $method = $self->initialize($class)->get_method($method_name);
863         return $method if defined $method;
864     }
865     return;
866 }
867
868 ## Attributes
869
870 sub add_attribute {
871     my $self      = shift;
872     # either we have an attribute object already
873     # or we need to create one from the args provided
874     my $attribute = blessed($_[0]) ? $_[0] : $self->attribute_metaclass->new(@_);
875     # make sure it is derived from the correct type though
876     ($attribute->isa('Class::MOP::Attribute'))
877         || confess "Your attribute must be an instance of Class::MOP::Attribute (or a subclass)";
878
879     # first we attach our new attribute
880     # because it might need certain information
881     # about the class which it is attached to
882     $attribute->attach_to_class($self);
883
884     my $attr_name = $attribute->name;
885
886     # then we remove attributes of a conflicting
887     # name here so that we can properly detach
888     # the old attr object, and remove any
889     # accessors it would have generated
890     if ( $self->has_attribute($attr_name) ) {
891         $self->remove_attribute($attr_name);
892     } else {
893         $self->invalidate_meta_instances();
894     }
895     
896     # get our count of previously inserted attributes and
897     # increment by one so this attribute knows its order
898     my $order = (scalar keys %{$self->get_attribute_map});
899     $attribute->_set_insertion_order($order);
900
901     # then onto installing the new accessors
902     $self->get_attribute_map->{$attr_name} = $attribute;
903
904     # invalidate package flag here
905     my $e = do {
906         local $@;
907         local $SIG{__DIE__};
908         eval { $attribute->install_accessors() };
909         $@;
910     };
911     if ( $e ) {
912         $self->remove_attribute($attr_name);
913         die $e;
914     }
915
916     return $attribute;
917 }
918
919 sub update_meta_instance_dependencies {
920     my $self = shift;
921
922     if ( $self->{meta_instance_dependencies} ) {
923         return $self->add_meta_instance_dependencies;
924     }
925 }
926
927 sub add_meta_instance_dependencies {
928     my $self = shift;
929
930     $self->remove_meta_instance_dependencies;
931
932     my @attrs = $self->get_all_attributes();
933
934     my %seen;
935     my @classes = grep { not $seen{$_->name}++ } map { $_->associated_class } @attrs;
936
937     foreach my $class ( @classes ) { 
938         $class->add_dependent_meta_instance($self);
939     }
940
941     $self->{meta_instance_dependencies} = \@classes;
942 }
943
944 sub remove_meta_instance_dependencies {
945     my $self = shift;
946
947     if ( my $classes = delete $self->{meta_instance_dependencies} ) {
948         foreach my $class ( @$classes ) {
949             $class->remove_dependent_meta_instance($self);
950         }
951
952         return $classes;
953     }
954
955     return;
956
957 }
958
959 sub add_dependent_meta_instance {
960     my ( $self, $metaclass ) = @_;
961     push @{ $self->{dependent_meta_instances} }, $metaclass;
962 }
963
964 sub remove_dependent_meta_instance {
965     my ( $self, $metaclass ) = @_;
966     my $name = $metaclass->name;
967     @$_ = grep { $_->name ne $name } @$_ for $self->{dependent_meta_instances};
968 }
969
970 sub invalidate_meta_instances {
971     my $self = shift;
972     $_->invalidate_meta_instance() for $self, @{ $self->{dependent_meta_instances} };
973 }
974
975 sub invalidate_meta_instance {
976     my $self = shift;
977     undef $self->{_meta_instance};
978 }
979
980 sub has_attribute {
981     my ($self, $attribute_name) = @_;
982     (defined $attribute_name && $attribute_name)
983         || confess "You must define an attribute name";
984     exists $self->get_attribute_map->{$attribute_name};
985 }
986
987 sub get_attribute {
988     my ($self, $attribute_name) = @_;
989     (defined $attribute_name && $attribute_name)
990         || confess "You must define an attribute name";
991     return $self->get_attribute_map->{$attribute_name}
992     # NOTE:
993     # this will return undef anyway, so no need ...
994     #    if $self->has_attribute($attribute_name);
995     #return;
996 }
997
998 sub remove_attribute {
999     my ($self, $attribute_name) = @_;
1000     (defined $attribute_name && $attribute_name)
1001         || confess "You must define an attribute name";
1002     my $removed_attribute = $self->get_attribute_map->{$attribute_name};
1003     return unless defined $removed_attribute;
1004     delete $self->get_attribute_map->{$attribute_name};
1005     $self->invalidate_meta_instances();
1006     $removed_attribute->remove_accessors();
1007     $removed_attribute->detach_from_class();
1008     return $removed_attribute;
1009 }
1010
1011 sub get_attribute_list {
1012     my $self = shift;
1013     keys %{$self->get_attribute_map};
1014 }
1015
1016 sub get_all_attributes {
1017     my $self = shift;
1018     my %attrs = map { %{ $self->initialize($_)->get_attribute_map } } reverse $self->linearized_isa;
1019     return values %attrs;
1020 }
1021
1022 sub compute_all_applicable_attributes {
1023     Carp::cluck('The compute_all_applicable_attributes method has been deprecated.'
1024         . " Use get_all_attributes instead.\n");
1025
1026     shift->get_all_attributes(@_);
1027 }
1028
1029 sub find_attribute_by_name {
1030     my ($self, $attr_name) = @_;
1031     foreach my $class ($self->linearized_isa) {
1032         # fetch the meta-class ...
1033         my $meta = $self->initialize($class);
1034         return $meta->get_attribute($attr_name)
1035             if $meta->has_attribute($attr_name);
1036     }
1037     return;
1038 }
1039
1040 # check if we can reinitialize
1041 sub is_pristine {
1042     my $self = shift;
1043
1044     # if any local attr is defined
1045     return if $self->get_attribute_list;
1046
1047     # or any non-declared methods
1048     if ( my @methods = values %{ $self->get_method_map } ) {
1049         my $metaclass = $self->method_metaclass;
1050         foreach my $method ( @methods ) {
1051             return if $method->isa("Class::MOP::Method::Generated");
1052             # FIXME do we need to enforce this too? return unless $method->isa($metaclass);
1053         }
1054     }
1055
1056     return 1;
1057 }
1058
1059 ## Class closing
1060
1061 sub is_mutable   { 1 }
1062 sub is_immutable { 0 }
1063
1064 sub _immutable_options {
1065     my ( $self, @args ) = @_;
1066
1067     return (
1068         inline_accessors   => 1,
1069         inline_constructor => 1,
1070         inline_destructor  => 0,
1071         debug              => 0,
1072         immutable_trait    => $self->immutable_trait,
1073         constructor_name   => $self->constructor_name,
1074         constructor_class  => $self->constructor_class,
1075         destructor_class   => $self->destructor_class,
1076         @args,
1077     );
1078 }
1079
1080 sub make_immutable {
1081     my ( $self, @args ) = @_;
1082
1083     if ( $self->is_mutable ) {
1084         $self->_initialize_immutable( $self->_immutable_options(@args) );
1085         $self->_rebless_as_immutable(@args);
1086         return $self;
1087     }
1088     else {
1089         return;
1090     }
1091 }
1092
1093 sub make_mutable {
1094     my $self = shift;
1095
1096     if ( $self->is_immutable ) {
1097         my @args = $self->immutable_options;
1098         $self->_rebless_as_mutable();
1099         $self->_remove_inlined_code(@args);
1100         delete $self->{__immutable};
1101         return $self;
1102     }
1103     else {
1104         return;
1105     }
1106 }
1107
1108 sub _rebless_as_immutable {
1109     my ( $self, @args ) = @_;
1110
1111     $self->{__immutable}{original_class} = ref $self;
1112
1113     bless $self => $self->_immutable_metaclass(@args);
1114 }
1115
1116 sub _immutable_metaclass {
1117     my ( $self, %args ) = @_;
1118
1119     if ( my $class = $args{immutable_metaclass} ) {
1120         return $class;
1121     }
1122
1123     my $trait = $args{immutable_trait} = $self->immutable_trait
1124         || confess "no immutable trait specified for $self";
1125
1126     my $meta      = $self->meta;
1127     my $meta_attr = $meta->find_attribute_by_name("immutable_trait");
1128
1129     my $class_name;
1130
1131     if ( $meta_attr and $trait eq $meta_attr->default ) {
1132         # if the trait is the same as the default we try and pick a
1133         # predictable name for the immutable metaclass
1134         $class_name = 'Class::MOP::Class::Immutable::' . ref($self);
1135     }
1136     else {
1137         $class_name = join '::', 'Class::MOP::Class::Immutable::CustomTrait',
1138             $trait, 'ForMetaClass', ref($self);
1139     }
1140
1141     return $class_name
1142         if Class::MOP::is_class_loaded($class_name);
1143
1144     # If the metaclass is a subclass of CMOP::Class which has had
1145     # metaclass roles applied (via Moose), then we want to make sure
1146     # that we preserve that anonymous class (see Fey::ORM for an
1147     # example of where this matters).
1148     my $meta_name
1149         = $meta->is_immutable
1150         ? $meta->get_mutable_metaclass_name
1151         : ref $meta;
1152
1153     my $immutable_meta = $meta_name->create(
1154         $class_name,
1155         superclasses => [ ref $self ],
1156     );
1157
1158     Class::MOP::load_class($trait);
1159     for my $meth ( Class::MOP::Class->initialize($trait)->get_all_methods ) {
1160         my $meth_name = $meth->name;
1161
1162         if ( $immutable_meta->find_method_by_name( $meth_name ) ) {
1163             $immutable_meta->add_around_method_modifier( $meth_name, $meth->body );
1164         }
1165         else {
1166             $immutable_meta->add_method( $meth_name, $meth->clone );
1167         }
1168     }
1169
1170     $immutable_meta->make_immutable(
1171         inline_constructor => 0,
1172         inline_accessors   => 0,
1173     );
1174
1175     return $class_name;
1176 }
1177
1178 sub _remove_inlined_code {
1179     my $self = shift;
1180
1181     $self->remove_method( $_->name ) for $self->_inlined_methods;
1182
1183     delete $self->{__immutable}{inlined_methods};
1184 }
1185
1186 sub _inlined_methods { @{ $_[0]{__immutable}{inlined_methods} || [] } }
1187
1188 sub _add_inlined_method {
1189     my ( $self, $method ) = @_;
1190
1191     push @{ $self->{__immutable}{inlined_methods} ||= [] }, $method;
1192 }
1193
1194 sub _initialize_immutable {
1195     my ( $self, %args ) = @_;
1196
1197     $self->{__immutable}{options} = \%args;
1198     $self->_install_inlined_code(%args);
1199 }
1200
1201 sub _install_inlined_code {
1202     my ( $self, %args ) = @_;
1203
1204     # FIXME
1205     $self->_inline_accessors(%args)   if $args{inline_accessors};
1206     $self->_inline_constructor(%args) if $args{inline_constructor};
1207     $self->_inline_destructor(%args)  if $args{inline_destructor};
1208 }
1209
1210 sub _rebless_as_mutable {
1211     my $self = shift;
1212
1213     bless $self, $self->get_mutable_metaclass_name;
1214
1215     return $self;
1216 }
1217
1218 sub _inline_accessors {
1219     my $self = shift;
1220
1221     foreach my $attr_name ( $self->get_attribute_list ) {
1222         $self->get_attribute($attr_name)->install_accessors(1);
1223     }
1224 }
1225
1226 sub _inline_constructor {
1227     my ( $self, %args ) = @_;
1228
1229     my $name = $args{constructor_name};
1230
1231     if ( $self->has_method($name) && !$args{replace_constructor} ) {
1232         my $class = $self->name;
1233         warn "Not inlining a constructor for $class since it defines"
1234             . " its own constructor.\n"
1235             . "If you are certain you don't need to inline your"
1236             . " constructor, specify inline_constructor => 0 in your"
1237             . " call to $class->meta->make_immutable\n";
1238         return;
1239     }
1240
1241     my $constructor_class = $args{constructor_class};
1242
1243     Class::MOP::load_class($constructor_class);
1244
1245     my $constructor = $constructor_class->new(
1246         options      => \%args,
1247         metaclass    => $self,
1248         is_inline    => 1,
1249         package_name => $self->name,
1250         name         => $name,
1251     );
1252
1253     if ( $args{replace_constructor} or $constructor->can_be_inlined ) {
1254         $self->add_method( $name => $constructor );
1255         $self->_add_inlined_method($constructor);
1256     }
1257 }
1258
1259 sub _inline_destructor {
1260     my ( $self, %args ) = @_;
1261
1262     ( exists $args{destructor_class} && defined $args{destructor_class} )
1263         || confess "The 'inline_destructor' option is present, but "
1264         . "no destructor class was specified";
1265
1266     if ( $self->has_method('DESTROY') && ! $args{replace_destructor} ) {
1267         my $class = $self->name;
1268         warn "Not inlining a destructor for $class since it defines"
1269             . " its own destructor.\n";
1270         return;
1271     }
1272
1273     my $destructor_class = $args{destructor_class};
1274
1275     Class::MOP::load_class($destructor_class);
1276
1277     return unless $destructor_class->is_needed($self);
1278
1279     my $destructor = $destructor_class->new(
1280         options      => \%args,
1281         metaclass    => $self,
1282         package_name => $self->name,
1283         name         => 'DESTROY'
1284     );
1285
1286     if ( $args{replace_destructor} or $destructor->can_be_inlined ) {
1287         $self->add_method( 'DESTROY' => $destructor );
1288         $self->_add_inlined_method($destructor);
1289     }
1290 }
1291
1292 1;
1293
1294 __END__
1295
1296 =pod
1297
1298 =head1 NAME
1299
1300 Class::MOP::Class - Class Meta Object
1301
1302 =head1 SYNOPSIS
1303
1304   # assuming that class Foo
1305   # has been defined, you can
1306
1307   # use this for introspection ...
1308
1309   # add a method to Foo ...
1310   Foo->meta->add_method( 'bar' => sub {...} )
1311
1312   # get a list of all the classes searched
1313   # the method dispatcher in the correct order
1314   Foo->meta->class_precedence_list()
1315
1316   # remove a method from Foo
1317   Foo->meta->remove_method('bar');
1318
1319   # or use this to actually create classes ...
1320
1321   Class::MOP::Class->create(
1322       'Bar' => (
1323           version      => '0.01',
1324           superclasses => ['Foo'],
1325           attributes   => [
1326               Class::MOP::Attribute->new('$bar'),
1327               Class::MOP::Attribute->new('$baz'),
1328           ],
1329           methods => {
1330               calculate_bar => sub {...},
1331               construct_baz => sub {...}
1332           }
1333       )
1334   );
1335
1336 =head1 DESCRIPTION
1337
1338 The Class Protocol is the largest and most complex part of the
1339 Class::MOP meta-object protocol. It controls the introspection and
1340 manipulation of Perl 5 classes, and it can create them as well. The
1341 best way to understand what this module can do, is to read the
1342 documentation for each of its methods.
1343
1344 =head1 INHERITANCE
1345
1346 C<Class::MOP::Class> is a subclass of L<Class::MOP::Module>.
1347
1348 =head1 METHODS
1349
1350 =head2 Class construction
1351
1352 These methods all create new C<Class::MOP::Class> objects. These
1353 objects can represent existing classes, or they can be used to create
1354 new classes from scratch.
1355
1356 The metaclass object for a given class is a singleton. If you attempt
1357 to create a metaclass for the same class twice, you will just get the
1358 existing object.
1359
1360 =over 4
1361
1362 =item B<< Class::MOP::Class->create($package_name, %options) >>
1363
1364 This method creates a new C<Class::MOP::Class> object with the given
1365 package name. It accepts a number of options.
1366
1367 =over 8
1368
1369 =item * version
1370
1371 An optional version number for the newly created package.
1372
1373 =item * authority
1374
1375 An optional authority for the newly created package.
1376
1377 =item * superclasses
1378
1379 An optional array reference of superclass names.
1380
1381 =item * methods
1382
1383 An optional hash reference of methods for the class. The keys of the
1384 hash reference are method names, and values are subroutine references.
1385
1386 =item * attributes
1387
1388 An optional array reference of L<Class::MOP::Attribute> objects.
1389
1390 =back
1391
1392 =item B<< Class::MOP::Class->create_anon_class(%options) >>
1393
1394 This method works just like C<< Class::MOP::Class->create >> but it
1395 creates an "anonymous" class. In fact, the class does have a name, but
1396 that name is a unique name generated internally by this module.
1397
1398 It accepts the same C<superclasses>, C<methods>, and C<attributes>
1399 parameters that C<create> accepts.
1400
1401 Anonymous classes are destroyed once the metaclass they are attached
1402 to goes out of scope, and will be removed from Perl's internal symbol
1403 table.
1404
1405 All instances of an anonymous class keep a special reference to the
1406 metaclass object, which prevents the metaclass from going out of scope
1407 while any instances exist.
1408
1409 This only works if the instance if based on a hash reference, however.
1410
1411 =item B<< Class::MOP::Class->initialize($package_name, %options) >>
1412
1413 This method will initialize a C<Class::MOP::Class> object for the
1414 named package. Unlike C<create>, this method I<will not> create a new
1415 class.
1416
1417 The purpose of this method is to retrieve a C<Class::MOP::Class>
1418 object for introspecting an existing class.
1419
1420 If an existing C<Class::MOP::Class> object exists for the named
1421 package, it will be returned, and any options provided will be
1422 ignored!
1423
1424 If the object does not yet exist, it will be created.
1425
1426 The valid options that can be passed to this method are
1427 C<attribute_metaclass>, C<method_metaclass>,
1428 C<wrapped_method_metaclass>, and C<instance_metaclass>. These are all
1429 optional, and default to the appropriate class in the C<Class::MOP>
1430 distribution.
1431
1432 =back
1433
1434 =head2 Object instance construction and cloning
1435
1436 These methods are all related to creating and/or cloning object
1437 instances.
1438
1439 =over 4
1440
1441 =item B<< $metaclass->clone_object($instance, %params) >>
1442
1443 This method clones an existing object instance. Any parameters you
1444 provide are will override existing attribute values in the object.
1445
1446 This is a convenience method for cloning an object instance, then
1447 blessing it into the appropriate package.
1448
1449 You could implement a clone method in your class, using this method:
1450
1451   sub clone {
1452       my ($self, %params) = @_;
1453       $self->meta->clone_object($self, %params);
1454   }
1455
1456 =item B<< $metaclass->rebless_instance($instance, %params) >>
1457
1458 This method changes the class of C<$instance> to the metaclass's class.
1459
1460 You can only rebless an instance into a subclass of its current
1461 class. If you pass any additional parameters, these will be treated
1462 like constructor parameters and used to initialize the object's
1463 attributes. Any existing attributes that are already set will be
1464 overwritten.
1465
1466 Before reblessing the instance, this method will call
1467 C<rebless_instance_away> on the instance's current metaclass. This method
1468 will be passed the instance, the new metaclass, and any parameters
1469 specified to C<rebless_instance>. By default, C<rebless_instance_away>
1470 does nothing; it is merely a hook.
1471
1472 =item B<< $metaclass->new_object(%params) >>
1473
1474 This method is used to create a new object of the metaclass's
1475 class. Any parameters you provide are used to initialize the
1476 instance's attributes. A special C<__INSTANCE__> key can be passed to
1477 provide an already generated instance, rather than having Class::MOP
1478 generate it for you. This is mostly useful for using Class::MOP with
1479 foreign classes, which generally generate instances using their own
1480 constructor.
1481
1482 =item B<< $metaclass->instance_metaclass >>
1483
1484 Returns the class name of the instance metaclass, see
1485 L<Class::MOP::Instance> for more information on the instance
1486 metaclass.
1487
1488 =item B<< $metaclass->get_meta_instance >>
1489
1490 Returns an instance of the C<instance_metaclass> to be used in the
1491 construction of a new instance of the class.
1492
1493 =back
1494
1495 =head2 Informational predicates
1496
1497 These are a few predicate methods for asking information about the
1498 class itself.
1499
1500 =over 4
1501
1502 =item B<< $metaclass->is_anon_class >>
1503
1504 This returns true if the class was created by calling C<<
1505 Class::MOP::Class->create_anon_class >>.
1506
1507 =item B<< $metaclass->is_mutable >>
1508
1509 This returns true if the class is still mutable.
1510
1511 =item B<< $metaclass->is_immutable >>
1512
1513 This returns true if the class has been made immutable.
1514
1515 =item B<< $metaclass->is_pristine >>
1516
1517 A class is I<not> pristine if it has non-inherited attributes or if it
1518 has any generated methods.
1519
1520 =back
1521
1522 =head2 Inheritance Relationships
1523
1524 =over 4
1525
1526 =item B<< $metaclass->superclasses(@superclasses) >>
1527
1528 This is a read-write accessor which represents the superclass
1529 relationships of the metaclass's class.
1530
1531 This is basically sugar around getting and setting C<@ISA>.
1532
1533 =item B<< $metaclass->class_precedence_list >>
1534
1535 This returns a list of all of the class's ancestor classes. The
1536 classes are returned in method dispatch order.
1537
1538 =item B<< $metaclass->linearized_isa >>
1539
1540 This returns a list based on C<class_precedence_list> but with all
1541 duplicates removed.
1542
1543 =item B<< $metaclass->subclasses >>
1544
1545 This returns a list of all subclasses for this class, even indirect
1546 subclasses.
1547
1548 =item B<< $metaclass->direct_subclasses >>
1549
1550 This returns a list of immediate subclasses for this class, which does not
1551 include indirect subclasses.
1552
1553 =back
1554
1555 =head2 Method introspection and creation
1556
1557 These methods allow you to introspect a class's methods, as well as
1558 add, remove, or change methods.
1559
1560 Determining what is truly a method in a Perl 5 class requires some
1561 heuristics (aka guessing).
1562
1563 Methods defined outside the package with a fully qualified name (C<sub
1564 Package::name { ... }>) will be included. Similarly, methods named
1565 with a fully qualified name using L<Sub::Name> are also included.
1566
1567 However, we attempt to ignore imported functions.
1568
1569 Ultimately, we are using heuristics to determine what truly is a
1570 method in a class, and these heuristics may get the wrong answer in
1571 some edge cases. However, for most "normal" cases the heuristics work
1572 correctly.
1573
1574 =over 4
1575
1576 =item B<< $metaclass->get_method($method_name) >>
1577
1578 This will return a L<Class::MOP::Method> for the specified
1579 C<$method_name>. If the class does not have the specified method, it
1580 returns C<undef>
1581
1582 =item B<< $metaclass->has_method($method_name) >>
1583
1584 Returns a boolean indicating whether or not the class defines the
1585 named method. It does not include methods inherited from parent
1586 classes.
1587
1588 =item B<< $metaclass->get_method_map >>
1589
1590 Returns a hash reference representing the methods defined in this
1591 class. The keys are method names and the values are
1592 L<Class::MOP::Method> objects.
1593
1594 =item B<< $metaclass->get_method_list >>
1595
1596 This will return a list of method I<names> for all methods defined in
1597 this class.
1598
1599 =item B<< $metaclass->get_all_methods >>
1600
1601 This will traverse the inheritance hierarchy and return a list of all
1602 the L<Class::MOP::Method> objects for this class and its parents.
1603
1604 =item B<< $metaclass->find_method_by_name($method_name) >>
1605
1606 This will return a L<Class::MOP::Method> for the specified
1607 C<$method_name>. If the class does not have the specified method, it
1608 returns C<undef>
1609
1610 Unlike C<get_method>, this method I<will> look for the named method in
1611 superclasses.
1612
1613 =item B<< $metaclass->get_all_method_names >>
1614
1615 This will return a list of method I<names> for all of this class's
1616 methods, including inherited methods.
1617
1618 =item B<< $metaclass->find_all_methods_by_name($method_name) >>
1619
1620 This method looks for the named method in the class and all of its
1621 parents. It returns every matching method it finds in the inheritance
1622 tree, so it returns a list of methods.
1623
1624 Each method is returned as a hash reference with three keys. The keys
1625 are C<name>, C<class>, and C<code>. The C<code> key has a
1626 L<Class::MOP::Method> object as its value.
1627
1628 The list of methods is distinct.
1629
1630 =item B<< $metaclass->find_next_method_by_name($method_name) >>
1631
1632 This method returns the first method in any superclass matching the
1633 given name. It is effectively the method that C<SUPER::$method_name>
1634 would dispatch to.
1635
1636 =item B<< $metaclass->add_method($method_name, $method) >>
1637
1638 This method takes a method name and a subroutine reference, and adds
1639 the method to the class.
1640
1641 The subroutine reference can be a L<Class::MOP::Method>, and you are
1642 strongly encouraged to pass a meta method object instead of a code
1643 reference. If you do so, that object gets stored as part of the
1644 class's method map directly. If not, the meta information will have to
1645 be recreated later, and may be incorrect.
1646
1647 If you provide a method object, this method will clone that object if
1648 the object's package name does not match the class name. This lets us
1649 track the original source of any methods added from other classes
1650 (notably Moose roles).
1651
1652 =item B<< $metaclass->remove_method($method_name) >>
1653
1654 Remove the named method from the class. This method returns the
1655 L<Class::MOP::Method> object for the method.
1656
1657 =item B<< $metaclass->method_metaclass >>
1658
1659 Returns the class name of the method metaclass, see
1660 L<Class::MOP::Method> for more information on the method metaclass.
1661
1662 =item B<< $metaclass->wrapped_method_metaclass >>
1663
1664 Returns the class name of the wrapped method metaclass, see
1665 L<Class::MOP::Method::Wrapped> for more information on the wrapped
1666 method metaclass.
1667
1668 =back
1669
1670 =head2 Attribute introspection and creation
1671
1672 Because Perl 5 does not have a core concept of attributes in classes,
1673 we can only return information about attributes which have been added
1674 via this class's methods. We cannot discover information about
1675 attributes which are defined in terms of "regular" Perl 5 methods.
1676
1677 =over 4
1678
1679 =item B<< $metaclass->get_attribute($attribute_name) >>
1680
1681 This will return a L<Class::MOP::Attribute> for the specified
1682 C<$attribute_name>. If the class does not have the specified
1683 attribute, it returns C<undef>.
1684
1685 NOTE that get_attribute does not search superclasses, for that you
1686 need to use C<find_attribute_by_name>.
1687
1688 =item B<< $metaclass->has_attribute($attribute_name) >>
1689
1690 Returns a boolean indicating whether or not the class defines the
1691 named attribute. It does not include attributes inherited from parent
1692 classes.
1693
1694 =item B<< $metaclass->get_attribute_map >>
1695
1696 Returns a hash reference representing the attributes defined in this
1697 class. The keys are attribute names and the values are
1698 L<Class::MOP::Attribute> objects.
1699
1700 =item B<< $metaclass->get_attribute_list >>
1701
1702 This will return a list of attributes I<names> for all attributes
1703 defined in this class.
1704
1705 =item B<< $metaclass->get_all_attributes >>
1706
1707 This will traverse the inheritance hierarchy and return a list of all
1708 the L<Class::MOP::Attribute> objects for this class and its parents.
1709
1710 =item B<< $metaclass->find_attribute_by_name($attribute_name) >>
1711
1712 This will return a L<Class::MOP::Attribute> for the specified
1713 C<$attribute_name>. If the class does not have the specified
1714 attribute, it returns C<undef>
1715
1716 Unlike C<get_attribute>, this attribute I<will> look for the named
1717 attribute in superclasses.
1718
1719 =item B<< $metaclass->add_attribute(...) >>
1720
1721 This method accepts either an existing L<Class::MOP::Attribute>
1722 object, or parameters suitable for passing to that class's C<new>
1723 method.
1724
1725 The attribute provided will be added to the class.
1726
1727 Any accessor methods defined by the attribute will be added to the
1728 class when the attribute is added.
1729
1730 If an attribute of the same name already exists, the old attribute
1731 will be removed first.
1732
1733 =item B<< $metaclass->remove_attribute($attribute_name) >>
1734
1735 This will remove the named attribute from the class, and
1736 L<Class::MOP::Attribute> object.
1737
1738 Removing an attribute also removes any accessor methods defined by the
1739 attribute.
1740
1741 However, note that removing an attribute will only affect I<future>
1742 object instances created for this class, not existing instances.
1743
1744 =item B<< $metaclass->attribute_metaclass >>
1745
1746 Returns the class name of the attribute metaclass for this class. By
1747 default, this is L<Class::MOP::Attribute>.  for more information on
1748
1749 =back
1750
1751 =head2 Class Immutability
1752
1753 Making a class immutable "freezes" the class definition. You can no
1754 longer call methods which alter the class, such as adding or removing
1755 methods or attributes.
1756
1757 Making a class immutable lets us optimize the class by inlining some
1758 methods, and also allows us to optimize some methods on the metaclass
1759 object itself.
1760
1761 After immutabilization, the metaclass object will cache most
1762 informational methods such as C<get_method_map> and
1763 C<get_all_attributes>. Methods which would alter the class, such as
1764 C<add_attribute>, C<add_method>, and so on will throw an error on an
1765 immutable metaclass object.
1766
1767 The immutabilization system in L<Moose> takes much greater advantage
1768 of the inlining features than Class::MOP itself does.
1769
1770 =over 4
1771
1772 =item B<< $metaclass->make_immutable(%options) >>
1773
1774 This method will create an immutable transformer and uses it to make
1775 the class and its metaclass object immutable.
1776
1777 This method accepts the following options:
1778
1779 =over 8
1780
1781 =item * inline_accessors
1782
1783 =item * inline_constructor
1784
1785 =item * inline_destructor
1786
1787 These are all booleans indicating whether the specified method(s)
1788 should be inlined.
1789
1790 By default, accessors and the constructor are inlined, but not the
1791 destructor.
1792
1793 =item * immutable_trait
1794
1795 The name of a class which will be used as a parent class for the
1796 metaclass object being made immutable. This "trait" implements the
1797 post-immutability functionality of the metaclass (but not the
1798 transformation itself).
1799
1800 This defaults to L<Class::MOP::Class::Immutable::Trait>.
1801
1802 =item * constructor_name
1803
1804 This is the constructor method name. This defaults to "new".
1805
1806 =item * constructor_class
1807
1808 The name of the method metaclass for constructors. It will be used to
1809 generate the inlined constructor. This defaults to
1810 "Class::MOP::Method::Constructor".
1811
1812 =item * replace_constructor
1813
1814 This is a boolean indicating whether an existing constructor should be
1815 replaced when inlining a constructor. This defaults to false.
1816
1817 =item * destructor_class
1818
1819 The name of the method metaclass for destructors. It will be used to
1820 generate the inlined destructor. This defaults to
1821 "Class::MOP::Method::Denstructor".
1822
1823 =item * replace_destructor
1824
1825 This is a boolean indicating whether an existing destructor should be
1826 replaced when inlining a destructor. This defaults to false.
1827
1828 =back
1829
1830 =item B<< $metaclass->make_mutable >>
1831
1832 Calling this method reverse the immutabilization transformation.
1833
1834 =back
1835
1836 =head2 Method Modifiers
1837
1838 Method modifiers are hooks which allow a method to be wrapped with
1839 I<before>, I<after> and I<around> method modifiers. Every time a
1840 method is called, it's modifiers are also called.
1841
1842 A class can modify its own methods, as well as methods defined in
1843 parent classes.
1844
1845 =head3 How method modifiers work?
1846
1847 Method modifiers work by wrapping the original method and then
1848 replacing it in the class's symbol table. The wrappers will handle
1849 calling all the modifiers in the appropriate order and preserving the
1850 calling context for the original method.
1851
1852 The return values of C<before> and C<after> modifiers are
1853 ignored. This is because their purpose is B<not> to filter the input
1854 and output of the primary method (this is done with an I<around>
1855 modifier).
1856
1857 This may seem like an odd restriction to some, but doing this allows
1858 for simple code to be added at the beginning or end of a method call
1859 without altering the function of the wrapped method or placing any
1860 extra responsibility on the code of the modifier.
1861
1862 Of course if you have more complex needs, you can use the C<around>
1863 modifier which allows you to change both the parameters passed to the
1864 wrapped method, as well as its return value.
1865
1866 Before and around modifiers are called in last-defined-first-called
1867 order, while after modifiers are called in first-defined-first-called
1868 order. So the call tree might looks something like this:
1869
1870   before 2
1871    before 1
1872     around 2
1873      around 1
1874       primary
1875      around 1
1876     around 2
1877    after 1
1878   after 2
1879
1880 =head3 What is the performance impact?
1881
1882 Of course there is a performance cost associated with method
1883 modifiers, but we have made every effort to make that cost directly
1884 proportional to the number of modifier features you utilize.
1885
1886 The wrapping method does it's best to B<only> do as much work as it
1887 absolutely needs to. In order to do this we have moved some of the
1888 performance costs to set-up time, where they are easier to amortize.
1889
1890 All this said, our benchmarks have indicated the following:
1891
1892   simple wrapper with no modifiers             100% slower
1893   simple wrapper with simple before modifier   400% slower
1894   simple wrapper with simple after modifier    450% slower
1895   simple wrapper with simple around modifier   500-550% slower
1896   simple wrapper with all 3 modifiers          1100% slower
1897
1898 These numbers may seem daunting, but you must remember, every feature
1899 comes with some cost. To put things in perspective, just doing a
1900 simple C<AUTOLOAD> which does nothing but extract the name of the
1901 method called and return it costs about 400% over a normal method
1902 call.
1903
1904 =over 4
1905
1906 =item B<< $metaclass->add_before_method_modifier($method_name, $code) >>
1907
1908 This wraps the specified method with the supplied subroutine
1909 reference. The modifier will be called as a method itself, and will
1910 receive the same arguments as are passed to the method.
1911
1912 When the modifier exits, the wrapped method will be called.
1913
1914 The return value of the modifier will be ignored.
1915
1916 =item B<< $metaclass->add_after_method_modifier($method_name, $code) >>
1917
1918 This wraps the specified method with the supplied subroutine
1919 reference. The modifier will be called as a method itself, and will
1920 receive the same arguments as are passed to the method.
1921
1922 When the wrapped methods exits, the modifier will be called.
1923
1924 The return value of the modifier will be ignored.
1925
1926 =item B<< $metaclass->add_around_method_modifier($method_name, $code) >>
1927
1928 This wraps the specified method with the supplied subroutine
1929 reference.
1930
1931 The first argument passed to the modifier will be a subroutine
1932 reference to the wrapped method. The second argument is the object,
1933 and after that come any arguments passed when the method is called.
1934
1935 The around modifier can choose to call the original method, as well as
1936 what arguments to pass if it does so.
1937
1938 The return value of the modifier is what will be seen by the caller.
1939
1940 =back
1941
1942 =head2 Introspection
1943
1944 =over 4
1945
1946 =item B<< Class::MOP::Class->meta >>
1947
1948 This will return a L<Class::MOP::Class> instance for this class.
1949
1950 It should also be noted that L<Class::MOP> will actually bootstrap
1951 this module by installing a number of attribute meta-objects into its
1952 metaclass.
1953
1954 =back
1955
1956 =head1 AUTHORS
1957
1958 Stevan Little E<lt>stevan@iinteractive.comE<gt>
1959
1960 =head1 COPYRIGHT AND LICENSE
1961
1962 Copyright 2006-2009 by Infinity Interactive, Inc.
1963
1964 L<http://www.iinteractive.com>
1965
1966 This library is free software; you can redistribute it and/or modify
1967 it under the same terms as Perl itself.
1968
1969 =cut