Implement naming routine in add_package_symbol(xsub) to avoid type-glob duplication
[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
268         @{$self->get_package_symbol({name => 'ISA', type => 'ARRAY', sigil => '$', create => 1 })} = ();
269         %{ $self->namespace } = ();
270
271         my ($serial_id) = ($name =~ /^$ANON_CLASS_PREFIX(\d+)/o);
272
273         Class::MOP::remove_metaclass_by_name($name);
274
275         no strict 'refs';
276         delete ${$ANON_CLASS_PREFIX}{$serial_id . '::'};
277         return;
278     }
279
280 }
281
282 # creating classes with MOP ...
283
284 sub create {
285     my ( $class, @args ) = @_;
286
287     unshift @args, 'package' if @args % 2 == 1;
288
289     my (%options) = @args;
290     my $package_name = $options{package};
291
292     (ref $options{superclasses} eq 'ARRAY')
293         || confess "You must pass an ARRAY ref of superclasses"
294             if exists $options{superclasses};
295             
296     (ref $options{attributes} eq 'ARRAY')
297         || confess "You must pass an ARRAY ref of attributes"
298             if exists $options{attributes};      
299             
300     (ref $options{methods} eq 'HASH')
301         || confess "You must pass a HASH ref of methods"
302             if exists $options{methods};                  
303
304     my (%initialize_options) = @args;
305     delete @initialize_options{qw(
306         package
307         superclasses
308         attributes
309         methods
310         version
311         authority
312     )};
313     my $meta = $class->initialize( $package_name => %initialize_options );
314
315     $meta->_instantiate_module( $options{version}, $options{authority} );
316
317     # FIXME totally lame
318     $meta->add_method('meta' => sub {
319         $class->initialize(ref($_[0]) || $_[0]);
320     });
321
322     $meta->superclasses(@{$options{superclasses}})
323         if exists $options{superclasses};
324     # NOTE:
325     # process attributes first, so that they can
326     # install accessors, but locally defined methods
327     # can then overwrite them. It is maybe a little odd, but
328     # I think this should be the order of things.
329     if (exists $options{attributes}) {
330         foreach my $attr (@{$options{attributes}}) {
331             $meta->add_attribute($attr);
332         }
333     }
334     if (exists $options{methods}) {
335         foreach my $method_name (keys %{$options{methods}}) {
336             $meta->add_method($method_name, $options{methods}->{$method_name});
337         }
338     }
339     return $meta;
340 }
341
342 ## Attribute readers
343
344 # NOTE:
345 # all these attribute readers will be bootstrapped
346 # away in the Class::MOP bootstrap section
347
348 sub get_attribute_map        { $_[0]->{'attributes'}                  }
349 sub attribute_metaclass      { $_[0]->{'attribute_metaclass'}         }
350 sub method_metaclass         { $_[0]->{'method_metaclass'}            }
351 sub wrapped_method_metaclass { $_[0]->{'wrapped_method_metaclass'}    }
352 sub instance_metaclass       { $_[0]->{'instance_metaclass'}          }
353 sub immutable_trait          { $_[0]->{'immutable_trait'}             }
354 sub constructor_class        { $_[0]->{'constructor_class'}           }
355 sub constructor_name         { $_[0]->{'constructor_name'}            }
356 sub destructor_class         { $_[0]->{'destructor_class'}            }
357
358 sub _method_map              { $_[0]->{'methods'}                     }
359
360 # Instance Construction & Cloning
361
362 sub new_object {
363     my $class = shift;
364
365     # NOTE:
366     # we need to protect the integrity of the
367     # Class::MOP::Class singletons here, so we
368     # delegate this to &construct_class_instance
369     # which will deal with the singletons
370     return $class->_construct_class_instance(@_)
371         if $class->name->isa('Class::MOP::Class');
372     return $class->_construct_instance(@_);
373 }
374
375 sub construct_instance {
376     Carp::cluck('The construct_instance method has been made private.'
377         . " The public version is deprecated and will be removed in a future release.\n");
378     shift->_construct_instance(@_);
379 }
380
381 sub _construct_instance {
382     my $class = shift;
383     my $params = @_ == 1 ? $_[0] : {@_};
384     my $meta_instance = $class->get_meta_instance();
385     # FIXME:
386     # the code below is almost certainly incorrect
387     # but this is foreign inheritance, so we might
388     # have to kludge it in the end.
389     my $instance = $params->{__INSTANCE__} || $meta_instance->create_instance();
390     foreach my $attr ($class->get_all_attributes()) {
391         $attr->initialize_instance_slot($meta_instance, $instance, $params);
392     }
393     # NOTE:
394     # this will only work for a HASH instance type
395     if ($class->is_anon_class) {
396         (reftype($instance) eq 'HASH')
397             || confess "Currently only HASH based instances are supported with instance of anon-classes";
398         # NOTE:
399         # At some point we should make this official
400         # as a reserved slot name, but right now I am
401         # going to keep it here.
402         # my $RESERVED_MOP_SLOT = '__MOP__';
403         $instance->{'__MOP__'} = $class;
404     }
405     return $instance;
406 }
407
408
409 sub get_meta_instance {
410     my $self = shift;
411     $self->{'_meta_instance'} ||= $self->_create_meta_instance();
412 }
413
414 sub create_meta_instance {
415     Carp::cluck('The create_meta_instance method has been made private.'
416         . " The public version is deprecated and will be removed in a future release.\n");
417     shift->_create_meta_instance(@_);
418 }
419
420 sub _create_meta_instance {
421     my $self = shift;
422     
423     my $instance = $self->instance_metaclass->new(
424         associated_metaclass => $self,
425         attributes => [ $self->get_all_attributes() ],
426     );
427
428     $self->add_meta_instance_dependencies()
429         if $instance->is_dependent_on_superclasses();
430
431     return $instance;
432 }
433
434 sub clone_object {
435     my $class    = shift;
436     my $instance = shift;
437     (blessed($instance) && $instance->isa($class->name))
438         || confess "You must pass an instance of the metaclass (" . (ref $class ? $class->name : $class) . "), not ($instance)";
439
440     # NOTE:
441     # we need to protect the integrity of the
442     # Class::MOP::Class singletons here, they
443     # should not be cloned.
444     return $instance if $instance->isa('Class::MOP::Class');
445     $class->_clone_instance($instance, @_);
446 }
447
448 sub clone_instance {
449     Carp::cluck('The clone_instance method has been made private.'
450         . " The public version is deprecated and will be removed in a future release.\n");
451     shift->_clone_instance(@_);
452 }
453
454 sub _clone_instance {
455     my ($class, $instance, %params) = @_;
456     (blessed($instance))
457         || confess "You can only clone instances, ($instance) is not a blessed instance";
458     my $meta_instance = $class->get_meta_instance();
459     my $clone = $meta_instance->clone_instance($instance);
460     foreach my $attr ($class->get_all_attributes()) {
461         if ( defined( my $init_arg = $attr->init_arg ) ) {
462             if (exists $params{$init_arg}) {
463                 $attr->set_value($clone, $params{$init_arg});
464             }
465         }
466     }
467     return $clone;
468 }
469
470 sub rebless_instance {
471     my ($self, $instance, %params) = @_;
472
473     my $old_metaclass = Class::MOP::class_of($instance);
474
475     my $old_class = $old_metaclass ? $old_metaclass->name : blessed($instance);
476     $self->name->isa($old_class)
477         || confess "You may rebless only into a subclass of ($old_class), of which (". $self->name .") isn't.";
478
479     $old_metaclass->rebless_instance_away($instance, $self, %params)
480         if $old_metaclass;
481
482     my $meta_instance = $self->get_meta_instance();
483
484     # rebless!
485     # we use $_[1] here because of t/306_rebless_overload.t regressions on 5.8.8
486     $meta_instance->rebless_instance_structure($_[1], $self);
487
488     foreach my $attr ( $self->get_all_attributes ) {
489         if ( $attr->has_value($instance) ) {
490             if ( defined( my $init_arg = $attr->init_arg ) ) {
491                 $params{$init_arg} = $attr->get_value($instance)
492                     unless exists $params{$init_arg};
493             } 
494             else {
495                 $attr->set_value($instance, $attr->get_value($instance));
496             }
497         }
498     }
499
500     foreach my $attr ($self->get_all_attributes) {
501         $attr->initialize_instance_slot($meta_instance, $instance, \%params);
502     }
503     
504     $instance;
505 }
506
507 sub rebless_instance_away {
508     # this intentionally does nothing, it is just a hook
509 }
510
511 # Inheritance
512
513 sub superclasses {
514     my $self     = shift;
515     my $var_spec = { sigil => '@', type => 'ARRAY', name => 'ISA', create => 1 };
516     if (@_) {
517         my @supers = @_;
518         @{$self->get_package_symbol($var_spec)} = @supers;
519
520         # NOTE:
521         # on 5.8 and below, we need to call
522         # a method to get Perl to detect
523         # a cycle in the class hierarchy
524         my $class = $self->name;
525         $class->isa($class);
526
527         # NOTE:
528         # we need to check the metaclass
529         # compatibility here so that we can
530         # be sure that the superclass is
531         # not potentially creating an issues
532         # we don't know about
533
534         $self->_check_metaclass_compatibility();
535         $self->_superclasses_updated();
536     }
537     @{$self->get_package_symbol($var_spec)};
538 }
539
540 sub _superclasses_updated {
541     my $self = shift;
542     $self->update_meta_instance_dependencies();
543 }
544
545 sub subclasses {
546     my $self = shift;
547     my $super_class = $self->name;
548
549     return @{ $super_class->mro::get_isarev() };
550 }
551
552 sub direct_subclasses {
553     my $self = shift;
554     my $super_class = $self->name;
555
556     return grep {
557         grep {
558             $_ eq $super_class
559         } Class::MOP::Class->initialize($_)->superclasses
560     } $self->subclasses;
561 }
562
563 sub linearized_isa {
564     return @{ mro::get_linear_isa( (shift)->name ) };
565 }
566
567 sub class_precedence_list {
568     my $self = shift;
569     my $name = $self->name;
570
571     unless (Class::MOP::IS_RUNNING_ON_5_10()) { 
572         # NOTE:
573         # We need to check for circular inheritance here
574         # if we are are not on 5.10, cause 5.8 detects it 
575         # late. This will do nothing if all is well, and 
576         # blow up otherwise. Yes, it's an ugly hack, better
577         # suggestions are welcome.        
578         # - SL
579         ($name || return)->isa('This is a test for circular inheritance') 
580     }
581
582     # if our mro is c3, we can 
583     # just grab the linear_isa
584     if (mro::get_mro($name) eq 'c3') {
585         return @{ mro::get_linear_isa($name) }
586     }
587     else {
588         # NOTE:
589         # we can't grab the linear_isa for dfs
590         # since it has all the duplicates 
591         # already removed.
592         return (
593             $name,
594             map {
595                 $self->initialize($_)->class_precedence_list()
596             } $self->superclasses()
597         );
598     }
599 }
600
601 ## Methods
602
603 sub wrap_method_body {
604     my ( $self, %args ) = @_;
605
606     ('CODE' eq ref $args{body})
607         || confess "Your code block must be a CODE reference";
608
609     $self->method_metaclass->wrap(
610         package_name => $self->name,
611         %args,
612     );
613 }
614
615 sub add_method {
616     my ($self, $method_name, $method) = @_;
617     (defined $method_name && $method_name)
618         || confess "You must define a method name";
619
620     my $body;
621     if (blessed($method)) {
622         $body = $method->body;
623         if ($method->package_name ne $self->name) {
624             $method = $method->clone(
625                 package_name => $self->name,
626                 name         => $method_name            
627             ) if $method->can('clone');
628         }
629
630         $method->attach_to_class($self);
631         $self->_method_map->{$method_name} = $method;
632     }
633     else {
634         # If a raw code reference is supplied, its method object is not created.
635         # The method object won't be created until required.
636         $body = $method;
637     }
638
639     $self->add_package_symbol(
640         { sigil => '&', type => 'CODE', name => $method_name },
641         $body,
642     );
643 }
644
645 {
646     my $fetch_and_prepare_method = sub {
647         my ($self, $method_name) = @_;
648         my $wrapped_metaclass = $self->wrapped_method_metaclass;
649         # fetch it locally
650         my $method = $self->get_method($method_name);
651         # if we dont have local ...
652         unless ($method) {
653             # try to find the next method
654             $method = $self->find_next_method_by_name($method_name);
655             # die if it does not exist
656             (defined $method)
657                 || confess "The method '$method_name' was not found in the inheritance hierarchy for " . $self->name;
658             # and now make sure to wrap it
659             # even if it is already wrapped
660             # because we need a new sub ref
661             $method = $wrapped_metaclass->wrap($method,
662                 package_name => $self->name,
663                 name         => $method_name,
664             );
665         }
666         else {
667             # now make sure we wrap it properly
668             $method = $wrapped_metaclass->wrap($method,
669                 package_name => $self->name,
670                 name         => $method_name,
671             ) unless $method->isa($wrapped_metaclass);
672         }
673         $self->add_method($method_name => $method);
674         return $method;
675     };
676
677     sub add_before_method_modifier {
678         my ($self, $method_name, $method_modifier) = @_;
679         (defined $method_name && $method_name)
680             || confess "You must pass in a method name";
681         my $method = $fetch_and_prepare_method->($self, $method_name);
682         $method->add_before_modifier(
683             subname(':before' => $method_modifier)
684         );
685     }
686
687     sub add_after_method_modifier {
688         my ($self, $method_name, $method_modifier) = @_;
689         (defined $method_name && $method_name)
690             || confess "You must pass in a method name";
691         my $method = $fetch_and_prepare_method->($self, $method_name);
692         $method->add_after_modifier(
693             subname(':after' => $method_modifier)
694         );
695     }
696
697     sub add_around_method_modifier {
698         my ($self, $method_name, $method_modifier) = @_;
699         (defined $method_name && $method_name)
700             || confess "You must pass in a method name";
701         my $method = $fetch_and_prepare_method->($self, $method_name);
702         $method->add_around_modifier(
703             subname(':around' => $method_modifier)
704         );
705     }
706
707     # NOTE:
708     # the methods above used to be named like this:
709     #    ${pkg}::${method}:(before|after|around)
710     # but this proved problematic when using one modifier
711     # to wrap multiple methods (something which is likely
712     # to happen pretty regularly IMO). So instead of naming
713     # it like this, I have chosen to just name them purely
714     # with their modifier names, like so:
715     #    :(before|after|around)
716     # The fact is that in a stack trace, it will be fairly
717     # evident from the context what method they are attached
718     # to, and so don't need the fully qualified name.
719 }
720
721 sub alias_method {
722     Carp::cluck("The alias_method method is deprecated. Use add_method instead.\n");
723
724     shift->add_method(@_);
725 }
726
727 sub _code_is_mine {
728     my ( $self, $code ) = @_;
729
730     my ( $code_package, $code_name ) = Class::MOP::get_code_info($code);
731
732     return $code_package && $code_package eq $self->name
733         || ( $code_package eq 'constant' && $code_name eq '__ANON__' );
734 }
735
736 sub has_method {
737     my ($self, $method_name) = @_;
738     (defined $method_name && $method_name)
739         || confess "You must define a method name";
740
741     return defined($self->get_method($method_name));
742 }
743
744 sub get_method {
745     my ($self, $method_name) = @_;
746     (defined $method_name && $method_name)
747         || confess "You must define a method name";
748
749     my $method_map    = $self->_method_map;
750     my $method_object = $method_map->{$method_name};
751     my $code = $self->get_package_symbol({
752         name  => $method_name,
753         sigil => '&',
754         type  => 'CODE',
755     });
756
757     unless ( $method_object && $method_object->body == ( $code || 0 ) ) {
758         if ( $code && $self->_code_is_mine($code) ) {
759             $method_object = $method_map->{$method_name}
760                 = $self->wrap_method_body(
761                 body                 => $code,
762                 name                 => $method_name,
763                 associated_metaclass => $self,
764                 );
765         }
766         else {
767             delete $method_map->{$method_name};
768             return undef;
769         }
770     }
771
772     return $method_object;
773 }
774
775 sub remove_method {
776     my ($self, $method_name) = @_;
777     (defined $method_name && $method_name)
778         || confess "You must define a method name";
779
780     my $removed_method = delete $self->get_method_map->{$method_name};
781     
782     $self->remove_package_symbol(
783         { sigil => '&', type => 'CODE', name => $method_name }
784     );
785
786     $removed_method->detach_from_class if $removed_method;
787
788     $self->update_package_cache_flag; # still valid, since we just removed the method from the map
789
790     return $removed_method;
791 }
792
793 sub get_method_list {
794     my $self = shift;
795     return grep { $self->has_method($_) } keys %{ $self->namespace };
796 }
797
798 sub find_method_by_name {
799     my ($self, $method_name) = @_;
800     (defined $method_name && $method_name)
801         || confess "You must define a method name to find";
802     foreach my $class ($self->linearized_isa) {
803         my $method = $self->initialize($class)->get_method($method_name);
804         return $method if defined $method;
805     }
806     return;
807 }
808
809 sub get_all_methods {
810     my $self = shift;
811     my %methods = map { %{ $self->initialize($_)->get_method_map } } reverse $self->linearized_isa;
812     return values %methods;
813 }
814
815 sub compute_all_applicable_methods {
816     Carp::cluck('The compute_all_applicable_methods method is deprecated.'
817         . " Use get_all_methods instead.\n");
818
819     return map {
820         {
821             name  => $_->name,
822             class => $_->package_name,
823             code  => $_, # sigh, overloading
824         },
825     } shift->get_all_methods(@_);
826 }
827
828 sub get_all_method_names {
829     my $self = shift;
830     my %uniq;
831     return grep { !$uniq{$_}++ } map { $self->initialize($_)->get_method_list } $self->linearized_isa;
832 }
833
834 sub find_all_methods_by_name {
835     my ($self, $method_name) = @_;
836     (defined $method_name && $method_name)
837         || confess "You must define a method name to find";
838     my @methods;
839     foreach my $class ($self->linearized_isa) {
840         # fetch the meta-class ...
841         my $meta = $self->initialize($class);
842         push @methods => {
843             name  => $method_name,
844             class => $class,
845             code  => $meta->get_method($method_name)
846         } if $meta->has_method($method_name);
847     }
848     return @methods;
849 }
850
851 sub find_next_method_by_name {
852     my ($self, $method_name) = @_;
853     (defined $method_name && $method_name)
854         || confess "You must define a method name to find";
855     my @cpl = $self->linearized_isa;
856     shift @cpl; # discard ourselves
857     foreach my $class (@cpl) {
858         my $method = $self->initialize($class)->get_method($method_name);
859         return $method if defined $method;
860     }
861     return;
862 }
863
864 ## Attributes
865
866 sub add_attribute {
867     my $self      = shift;
868     # either we have an attribute object already
869     # or we need to create one from the args provided
870     my $attribute = blessed($_[0]) ? $_[0] : $self->attribute_metaclass->new(@_);
871     # make sure it is derived from the correct type though
872     ($attribute->isa('Class::MOP::Attribute'))
873         || confess "Your attribute must be an instance of Class::MOP::Attribute (or a subclass)";
874
875     # first we attach our new attribute
876     # because it might need certain information
877     # about the class which it is attached to
878     $attribute->attach_to_class($self);
879
880     my $attr_name = $attribute->name;
881
882     # then we remove attributes of a conflicting
883     # name here so that we can properly detach
884     # the old attr object, and remove any
885     # accessors it would have generated
886     if ( $self->has_attribute($attr_name) ) {
887         $self->remove_attribute($attr_name);
888     } else {
889         $self->invalidate_meta_instances();
890     }
891     
892     # get our count of previously inserted attributes and
893     # increment by one so this attribute knows its order
894     my $order = (scalar keys %{$self->get_attribute_map});
895     $attribute->_set_insertion_order($order);
896
897     # then onto installing the new accessors
898     $self->get_attribute_map->{$attr_name} = $attribute;
899
900     # invalidate package flag here
901     my $e = do {
902         local $@;
903         local $SIG{__DIE__};
904         eval { $attribute->install_accessors() };
905         $@;
906     };
907     if ( $e ) {
908         $self->remove_attribute($attr_name);
909         die $e;
910     }
911
912     return $attribute;
913 }
914
915 sub update_meta_instance_dependencies {
916     my $self = shift;
917
918     if ( $self->{meta_instance_dependencies} ) {
919         return $self->add_meta_instance_dependencies;
920     }
921 }
922
923 sub add_meta_instance_dependencies {
924     my $self = shift;
925
926     $self->remove_meta_instance_dependencies;
927
928     my @attrs = $self->get_all_attributes();
929
930     my %seen;
931     my @classes = grep { not $seen{$_->name}++ } map { $_->associated_class } @attrs;
932
933     foreach my $class ( @classes ) { 
934         $class->add_dependent_meta_instance($self);
935     }
936
937     $self->{meta_instance_dependencies} = \@classes;
938 }
939
940 sub remove_meta_instance_dependencies {
941     my $self = shift;
942
943     if ( my $classes = delete $self->{meta_instance_dependencies} ) {
944         foreach my $class ( @$classes ) {
945             $class->remove_dependent_meta_instance($self);
946         }
947
948         return $classes;
949     }
950
951     return;
952
953 }
954
955 sub add_dependent_meta_instance {
956     my ( $self, $metaclass ) = @_;
957     push @{ $self->{dependent_meta_instances} }, $metaclass;
958 }
959
960 sub remove_dependent_meta_instance {
961     my ( $self, $metaclass ) = @_;
962     my $name = $metaclass->name;
963     @$_ = grep { $_->name ne $name } @$_ for $self->{dependent_meta_instances};
964 }
965
966 sub invalidate_meta_instances {
967     my $self = shift;
968     $_->invalidate_meta_instance() for $self, @{ $self->{dependent_meta_instances} };
969 }
970
971 sub invalidate_meta_instance {
972     my $self = shift;
973     undef $self->{_meta_instance};
974 }
975
976 sub has_attribute {
977     my ($self, $attribute_name) = @_;
978     (defined $attribute_name && $attribute_name)
979         || confess "You must define an attribute name";
980     exists $self->get_attribute_map->{$attribute_name};
981 }
982
983 sub get_attribute {
984     my ($self, $attribute_name) = @_;
985     (defined $attribute_name && $attribute_name)
986         || confess "You must define an attribute name";
987     return $self->get_attribute_map->{$attribute_name}
988     # NOTE:
989     # this will return undef anyway, so no need ...
990     #    if $self->has_attribute($attribute_name);
991     #return;
992 }
993
994 sub remove_attribute {
995     my ($self, $attribute_name) = @_;
996     (defined $attribute_name && $attribute_name)
997         || confess "You must define an attribute name";
998     my $removed_attribute = $self->get_attribute_map->{$attribute_name};
999     return unless defined $removed_attribute;
1000     delete $self->get_attribute_map->{$attribute_name};
1001     $self->invalidate_meta_instances();
1002     $removed_attribute->remove_accessors();
1003     $removed_attribute->detach_from_class();
1004     return $removed_attribute;
1005 }
1006
1007 sub get_attribute_list {
1008     my $self = shift;
1009     keys %{$self->get_attribute_map};
1010 }
1011
1012 sub get_all_attributes {
1013     my $self = shift;
1014     my %attrs = map { %{ $self->initialize($_)->get_attribute_map } } reverse $self->linearized_isa;
1015     return values %attrs;
1016 }
1017
1018 sub compute_all_applicable_attributes {
1019     Carp::cluck('The compute_all_applicable_attributes method has been deprecated.'
1020         . " Use get_all_attributes instead.\n");
1021
1022     shift->get_all_attributes(@_);
1023 }
1024
1025 sub find_attribute_by_name {
1026     my ($self, $attr_name) = @_;
1027     foreach my $class ($self->linearized_isa) {
1028         # fetch the meta-class ...
1029         my $meta = $self->initialize($class);
1030         return $meta->get_attribute($attr_name)
1031             if $meta->has_attribute($attr_name);
1032     }
1033     return;
1034 }
1035
1036 # check if we can reinitialize
1037 sub is_pristine {
1038     my $self = shift;
1039
1040     # if any local attr is defined
1041     return if $self->get_attribute_list;
1042
1043     # or any non-declared methods
1044     if ( my @methods = values %{ $self->get_method_map } ) {
1045         my $metaclass = $self->method_metaclass;
1046         foreach my $method ( @methods ) {
1047             return if $method->isa("Class::MOP::Method::Generated");
1048             # FIXME do we need to enforce this too? return unless $method->isa($metaclass);
1049         }
1050     }
1051
1052     return 1;
1053 }
1054
1055 ## Class closing
1056
1057 sub is_mutable   { 1 }
1058 sub is_immutable { 0 }
1059
1060 sub _immutable_options {
1061     my ( $self, @args ) = @_;
1062
1063     return (
1064         inline_accessors   => 1,
1065         inline_constructor => 1,
1066         inline_destructor  => 0,
1067         debug              => 0,
1068         immutable_trait    => $self->immutable_trait,
1069         constructor_name   => $self->constructor_name,
1070         constructor_class  => $self->constructor_class,
1071         destructor_class   => $self->destructor_class,
1072         @args,
1073     );
1074 }
1075
1076 sub make_immutable {
1077     my ( $self, @args ) = @_;
1078
1079     if ( $self->is_mutable ) {
1080         $self->_initialize_immutable( $self->_immutable_options(@args) );
1081         $self->_rebless_as_immutable(@args);
1082         return $self;
1083     }
1084     else {
1085         return;
1086     }
1087 }
1088
1089 sub make_mutable {
1090     my $self = shift;
1091
1092     if ( $self->is_immutable ) {
1093         my @args = $self->immutable_options;
1094         $self->_rebless_as_mutable();
1095         $self->_remove_inlined_code(@args);
1096         delete $self->{__immutable};
1097         return $self;
1098     }
1099     else {
1100         return;
1101     }
1102 }
1103
1104 sub _rebless_as_immutable {
1105     my ( $self, @args ) = @_;
1106
1107     $self->{__immutable}{original_class} = ref $self;
1108
1109     bless $self => $self->_immutable_metaclass(@args);
1110 }
1111
1112 sub _immutable_metaclass {
1113     my ( $self, %args ) = @_;
1114
1115     if ( my $class = $args{immutable_metaclass} ) {
1116         return $class;
1117     }
1118
1119     my $trait = $args{immutable_trait} = $self->immutable_trait
1120         || confess "no immutable trait specified for $self";
1121
1122     my $meta      = $self->meta;
1123     my $meta_attr = $meta->find_attribute_by_name("immutable_trait");
1124
1125     my $class_name;
1126
1127     if ( $meta_attr and $trait eq $meta_attr->default ) {
1128         # if the trait is the same as the default we try and pick a
1129         # predictable name for the immutable metaclass
1130         $class_name = 'Class::MOP::Class::Immutable::' . ref($self);
1131     }
1132     else {
1133         $class_name = join '::', 'Class::MOP::Class::Immutable::CustomTrait',
1134             $trait, 'ForMetaClass', ref($self);
1135     }
1136
1137     return $class_name
1138         if Class::MOP::is_class_loaded($class_name);
1139
1140     # If the metaclass is a subclass of CMOP::Class which has had
1141     # metaclass roles applied (via Moose), then we want to make sure
1142     # that we preserve that anonymous class (see Fey::ORM for an
1143     # example of where this matters).
1144     my $meta_name
1145         = $meta->is_immutable
1146         ? $meta->get_mutable_metaclass_name
1147         : ref $meta;
1148
1149     my $immutable_meta = $meta_name->create(
1150         $class_name,
1151         superclasses => [ ref $self ],
1152     );
1153
1154     Class::MOP::load_class($trait);
1155     for my $meth ( Class::MOP::Class->initialize($trait)->get_all_methods ) {
1156         my $meth_name = $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