move Devel::GlobalDestruction usage to MOP.pm so that when it fails to load and we...
[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::Immutable;
8 use Class::MOP::Instance;
9 use Class::MOP::Method::Wrapped;
10
11 use Carp         'confess';
12 use Scalar::Util 'blessed', 'weaken';
13
14 our $VERSION   = '0.65';
15 our $AUTHORITY = 'cpan:STEVAN';
16
17 use base 'Class::MOP::Module';
18
19 # Creation
20
21 sub initialize {
22     my $class = shift;
23
24     my $package_name;
25     
26     if ( @_ % 2 ) {
27         $package_name = shift;
28     } else {
29         my %options = @_;
30         $package_name = $options{package};
31     }
32
33     (defined $package_name && $package_name && !ref($package_name))
34         || confess "You must pass a package name and it cannot be blessed";
35
36     return Class::MOP::get_metaclass_by_name($package_name)
37         || $class->construct_class_instance(package => $package_name, @_);
38 }
39
40 sub reinitialize {
41     my $class        = shift;
42     my $package_name = shift;
43     (defined $package_name && $package_name && !blessed($package_name))
44         || confess "You must pass a package name and it cannot be blessed";
45     Class::MOP::remove_metaclass_by_name($package_name);
46     $class->construct_class_instance('package' => $package_name, @_);
47 }
48
49 # NOTE: (meta-circularity)
50 # this is a special form of &construct_instance
51 # (see below), which is used to construct class
52 # meta-object instances for any Class::MOP::*
53 # class. All other classes will use the more
54 # normal &construct_instance.
55 sub construct_class_instance {
56     my $class        = shift;
57     my %options      = @_;
58     my $package_name = $options{'package'};
59     (defined $package_name && $package_name)
60         || confess "You must pass a package name";
61     # NOTE:
62     # return the metaclass if we have it cached,
63     # and it is still defined (it has not been
64     # reaped by DESTROY yet, which can happen
65     # annoyingly enough during global destruction)
66
67     if (defined(my $meta = Class::MOP::get_metaclass_by_name($package_name))) {
68         return $meta;
69     }
70
71     # NOTE:
72     # we need to deal with the possibility
73     # of class immutability here, and then
74     # get the name of the class appropriately
75     $class = (ref($class)
76                     ? ($class->is_immutable
77                         ? $class->get_mutable_metaclass_name()
78                         : ref($class))
79                     : $class);
80
81     # now create the metaclass
82     my $meta;
83     if ($class eq 'Class::MOP::Class') {
84         no strict 'refs';
85         $meta = bless {
86             # inherited from Class::MOP::Package
87             'package'             => $package_name,
88
89             # NOTE:
90             # since the following attributes will
91             # actually be loaded from the symbol
92             # table, and actually bypass the instance
93             # entirely, we can just leave these things
94             # listed here for reference, because they
95             # should not actually have a value associated
96             # with the slot.
97             'namespace'           => \undef,
98             # inherited from Class::MOP::Module
99             'version'             => \undef,
100             'authority'           => \undef,
101             # defined in Class::MOP::Class
102             'superclasses'        => \undef,
103
104             'methods'             => {},
105             'attributes'          => {},
106             'attribute_metaclass' => $options{'attribute_metaclass'} || 'Class::MOP::Attribute',
107             'method_metaclass'    => $options{'method_metaclass'}    || 'Class::MOP::Method',
108             'instance_metaclass'  => $options{'instance_metaclass'}  || 'Class::MOP::Instance',
109             
110             ## uber-private variables
111             # NOTE:
112             # this starts out as undef so that 
113             # we can tell the first time the 
114             # methods are fetched
115             # - SL
116             '_package_cache_flag'       => undef,  
117             '_meta_instance'            => undef,          
118         } => $class;
119     }
120     else {
121         # NOTE:
122         # it is safe to use meta here because
123         # class will always be a subclass of
124         # Class::MOP::Class, which defines meta
125         $meta = $class->meta->construct_instance(%options)
126     }
127
128     # and check the metaclass compatibility
129     $meta->check_metaclass_compatability();  
130
131     Class::MOP::store_metaclass_by_name($package_name, $meta);
132
133     # NOTE:
134     # we need to weaken any anon classes
135     # so that they can call DESTROY properly
136     Class::MOP::weaken_metaclass($package_name) if $meta->is_anon_class;
137
138     $meta;
139 }
140
141 sub reset_package_cache_flag  { (shift)->{'_package_cache_flag'} = undef } 
142 sub update_package_cache_flag {
143     my $self = shift;
144     # NOTE:
145     # we can manually update the cache number 
146     # since we are actually adding the method
147     # to our cache as well. This avoids us 
148     # having to regenerate the method_map.
149     # - SL    
150     $self->{'_package_cache_flag'} = Class::MOP::check_package_cache_flag($self->name);    
151 }
152
153 sub check_metaclass_compatability {
154     my $self = shift;
155
156     # this is always okay ...
157     return if ref($self)                eq 'Class::MOP::Class'   &&
158               $self->instance_metaclass eq 'Class::MOP::Instance';
159
160     my @class_list = $self->linearized_isa;
161     shift @class_list; # shift off $self->name
162
163     foreach my $class_name (@class_list) {
164         my $meta = Class::MOP::get_metaclass_by_name($class_name) || next;
165
166         # NOTE:
167         # we need to deal with the possibility
168         # of class immutability here, and then
169         # get the name of the class appropriately
170         my $meta_type = ($meta->is_immutable
171                             ? $meta->get_mutable_metaclass_name()
172                             : ref($meta));
173
174         ($self->isa($meta_type))
175             || confess $self->name . "->meta => (" . (ref($self)) . ")" .
176                        " is not compatible with the " .
177                        $class_name . "->meta => (" . ($meta_type)     . ")";
178         # NOTE:
179         # we also need to check that instance metaclasses
180         # are compatabile in the same the class.
181         ($self->instance_metaclass->isa($meta->instance_metaclass))
182             || confess $self->name . "->meta => (" . ($self->instance_metaclass) . ")" .
183                        " is not compatible with the " .
184                        $class_name . "->meta => (" . ($meta->instance_metaclass) . ")";
185     }
186 }
187
188 ## ANON classes
189
190 {
191     # NOTE:
192     # this should be sufficient, if you have a
193     # use case where it is not, write a test and
194     # I will change it.
195     my $ANON_CLASS_SERIAL = 0;
196
197     # NOTE:
198     # we need a sufficiently annoying prefix
199     # this should suffice for now, this is
200     # used in a couple of places below, so
201     # need to put it up here for now.
202     my $ANON_CLASS_PREFIX = 'Class::MOP::Class::__ANON__::SERIAL::';
203
204     sub is_anon_class {
205         my $self = shift;
206         no warnings 'uninitialized';
207         $self->name =~ /^$ANON_CLASS_PREFIX/;
208     }
209
210     sub create_anon_class {
211         my ($class, %options) = @_;
212         my $package_name = $ANON_CLASS_PREFIX . ++$ANON_CLASS_SERIAL;
213         return $class->create($package_name, %options);
214     }
215
216     # NOTE:
217     # this will only get called for
218     # anon-classes, all other calls
219     # are assumed to occur during
220     # global destruction and so don't
221     # really need to be handled explicitly
222     sub DESTROY {
223         my $self = shift;
224
225         return if Class::MOP::in_global_destruction; # it'll happen soon anyway and this just makes things more complicated
226
227         no warnings 'uninitialized';
228         return unless $self->name =~ /^$ANON_CLASS_PREFIX/;
229         my ($serial_id) = ($self->name =~ /^$ANON_CLASS_PREFIX(\d+)/);
230         no strict 'refs';
231         foreach my $key (keys %{$ANON_CLASS_PREFIX . $serial_id}) {
232             delete ${$ANON_CLASS_PREFIX . $serial_id}{$key};
233         }
234         delete ${'main::' . $ANON_CLASS_PREFIX}{$serial_id . '::'};
235     }
236
237 }
238
239 # creating classes with MOP ...
240
241 sub create {
242     my ( $class, @args ) = @_;
243
244     unshift @args, 'package' if @args % 2 == 1;
245
246     my (%options) = @args;
247     my $package_name = $options{package};
248
249     (defined $package_name && $package_name)
250         || confess "You must pass a package name";
251     
252     (ref $options{superclasses} eq 'ARRAY')
253         || confess "You must pass an ARRAY ref of superclasses"
254             if exists $options{superclasses};
255             
256     (ref $options{attributes} eq 'ARRAY')
257         || confess "You must pass an ARRAY ref of attributes"
258             if exists $options{attributes};      
259             
260     (ref $options{methods} eq 'HASH')
261         || confess "You must pass an HASH ref of methods"
262             if exists $options{methods};                  
263
264     my $code = "package $package_name;";
265     $code .= "\$$package_name\:\:VERSION = '" . $options{version} . "';"
266         if exists $options{version};
267     $code .= "\$$package_name\:\:AUTHORITY = '" . $options{authority} . "';"
268         if exists $options{authority};
269
270     eval $code;
271     confess "creation of $package_name failed : $@" if $@;
272
273     my $meta = $class->initialize($package_name);
274
275     # FIXME totally lame
276     $meta->add_method('meta' => sub {
277         $class->initialize(ref($_[0]) || $_[0]);
278     });
279
280     $meta->superclasses(@{$options{superclasses}})
281         if exists $options{superclasses};
282     # NOTE:
283     # process attributes first, so that they can
284     # install accessors, but locally defined methods
285     # can then overwrite them. It is maybe a little odd, but
286     # I think this should be the order of things.
287     if (exists $options{attributes}) {
288         foreach my $attr (@{$options{attributes}}) {
289             $meta->add_attribute($attr);
290         }
291     }
292     if (exists $options{methods}) {
293         foreach my $method_name (keys %{$options{methods}}) {
294             $meta->add_method($method_name, $options{methods}->{$method_name});
295         }
296     }
297     return $meta;
298 }
299
300 ## Attribute readers
301
302 # NOTE:
303 # all these attribute readers will be bootstrapped
304 # away in the Class::MOP bootstrap section
305
306 sub get_attribute_map   { $_[0]->{'attributes'}          }
307 sub attribute_metaclass { $_[0]->{'attribute_metaclass'} }
308 sub method_metaclass    { $_[0]->{'method_metaclass'}    }
309 sub instance_metaclass  { $_[0]->{'instance_metaclass'}  }
310
311 # FIXME:
312 # this is a prime canidate for conversion to XS
313 sub get_method_map {
314     my $self = shift;
315     
316     my $current = Class::MOP::check_package_cache_flag($self->name);
317
318     if (defined $self->{'_package_cache_flag'} && $self->{'_package_cache_flag'} == $current) {
319         return $self->{'methods'};
320     }
321
322     $self->{_package_cache_flag} = $current;
323
324     my $map  = $self->{'methods'};
325
326     my $class_name       = $self->name;
327     my $method_metaclass = $self->method_metaclass;
328
329     my %all_code = $self->get_all_package_symbols('CODE');
330
331     foreach my $symbol (keys %all_code) {
332         my $code = $all_code{$symbol};
333
334         next if exists  $map->{$symbol} &&
335                 defined $map->{$symbol} &&
336                         $map->{$symbol}->body == $code;
337
338         my ($pkg, $name) = Class::MOP::get_code_info($code);
339         
340         # NOTE:
341         # in 5.10 constant.pm the constants show up 
342         # as being in the right package, but in pre-5.10
343         # they show up as constant::__ANON__ so we 
344         # make an exception here to be sure that things
345         # work as expected in both.
346         # - SL
347         unless ($pkg eq 'constant' && $name eq '__ANON__') {
348             next if ($pkg  || '') ne $class_name ||
349                     (($name || '') ne '__ANON__' && ($pkg  || '') ne $class_name);
350         }
351
352         $map->{$symbol} = $method_metaclass->wrap(
353             $code,
354             associated_metaclass => $self,
355             package_name         => $class_name,
356             name                 => $symbol,
357         );
358     }
359
360     return $map;
361 }
362
363 # Instance Construction & Cloning
364
365 sub new_object {
366     my $class = shift;
367
368     # NOTE:
369     # we need to protect the integrity of the
370     # Class::MOP::Class singletons here, so we
371     # delegate this to &construct_class_instance
372     # which will deal with the singletons
373     return $class->construct_class_instance(@_)
374         if $class->name->isa('Class::MOP::Class');
375     return $class->construct_instance(@_);
376 }
377
378 sub construct_instance {
379     my ($class, %params) = @_;
380     my $meta_instance = $class->get_meta_instance();
381     my $instance = $meta_instance->create_instance();
382     foreach my $attr ($class->compute_all_applicable_attributes()) {
383         $attr->initialize_instance_slot($meta_instance, $instance, \%params);
384     }
385     # NOTE:
386     # this will only work for a HASH instance type
387     if ($class->is_anon_class) {
388         (Scalar::Util::reftype($instance) eq 'HASH')
389             || confess "Currently only HASH based instances are supported with instance of anon-classes";
390         # NOTE:
391         # At some point we should make this official
392         # as a reserved slot name, but right now I am
393         # going to keep it here.
394         # my $RESERVED_MOP_SLOT = '__MOP__';
395         $instance->{'__MOP__'} = $class;
396     }
397     return $instance;
398 }
399
400
401 sub get_meta_instance {
402     my $self = shift;
403     $self->{'_meta_instance'} ||= $self->create_meta_instance();
404 }
405
406 sub create_meta_instance {
407     my $self = shift;
408     
409     my $instance = $self->instance_metaclass->new(
410         associated_metaclass => $self,
411         attributes => [ $self->compute_all_applicable_attributes() ],
412     );
413
414     $self->add_meta_instance_dependencies()
415         if $instance->is_dependent_on_superclasses();
416
417     return $instance;
418 }
419
420 sub clone_object {
421     my $class    = shift;
422     my $instance = shift;
423     (blessed($instance) && $instance->isa($class->name))
424         || confess "You must pass an instance of the metaclass (" . (ref $class ? $class->name : $class) . "), not ($instance)";
425
426     # NOTE:
427     # we need to protect the integrity of the
428     # Class::MOP::Class singletons here, they
429     # should not be cloned.
430     return $instance if $instance->isa('Class::MOP::Class');
431     $class->clone_instance($instance, @_);
432 }
433
434 sub clone_instance {
435     my ($class, $instance, %params) = @_;
436     (blessed($instance))
437         || confess "You can only clone instances, ($instance) is not a blessed instance";
438     my $meta_instance = $class->get_meta_instance();
439     my $clone = $meta_instance->clone_instance($instance);
440     foreach my $attr ($class->compute_all_applicable_attributes()) {
441         if ( defined( my $init_arg = $attr->init_arg ) ) {
442             if (exists $params{$init_arg}) {
443                 $attr->set_value($clone, $params{$init_arg});
444             }
445         }
446     }
447     return $clone;
448 }
449
450 sub rebless_instance {
451     my ($self, $instance, %params) = @_;
452
453     my $old_metaclass;
454     if ($instance->can('meta')) {
455         ($instance->meta->isa('Class::MOP::Class'))
456             || confess 'Cannot rebless instance if ->meta is not an instance of Class::MOP::Class';
457         $old_metaclass = $instance->meta;
458     }
459     else {
460         $old_metaclass = $self->initialize(ref($instance));
461     }
462
463     my $meta_instance = $self->get_meta_instance();
464
465     $self->name->isa($old_metaclass->name)
466         || confess "You may rebless only into a subclass of (". $old_metaclass->name ."), of which (". $self->name .") isn't.";
467
468     # rebless!
469     $meta_instance->rebless_instance_structure($instance, $self);
470
471     foreach my $attr ( $self->compute_all_applicable_attributes ) {
472         if ( $attr->has_value($instance) ) {
473             if ( defined( my $init_arg = $attr->init_arg ) ) {
474                 $params{$init_arg} = $attr->get_value($instance)
475                     unless exists $params{$init_arg};
476             } 
477             else {
478                 $attr->set_value($instance, $attr->get_value($instance));
479             }
480         }
481     }
482
483     foreach my $attr ($self->compute_all_applicable_attributes) {
484         $attr->initialize_instance_slot($meta_instance, $instance, \%params);
485     }
486     
487     $instance;
488 }
489
490 # Inheritance
491
492 sub superclasses {
493     my $self     = shift;
494     my $var_spec = { sigil => '@', type => 'ARRAY', name => 'ISA' };
495     if (@_) {
496         my @supers = @_;
497         @{$self->get_package_symbol($var_spec)} = @supers;
498         # NOTE:
499         # we need to check the metaclass
500         # compatibility here so that we can
501         # be sure that the superclass is
502         # not potentially creating an issues
503         # we don't know about
504         $self->check_metaclass_compatability();
505         $self->update_meta_instance_dependencies();
506     }
507     @{$self->get_package_symbol($var_spec)};
508 }
509
510 sub subclasses {
511     my $self = shift;
512
513     my $super_class = $self->name;
514
515     if ( Class::MOP::HAVE_ISAREV() ) {
516         return @{ $super_class->mro::get_isarev() };
517     } else {
518         my @derived_classes;
519
520         my $find_derived_classes;
521         $find_derived_classes = sub {
522             my ($outer_class) = @_;
523
524             my $symbol_table_hashref = do { no strict 'refs'; \%{"${outer_class}::"} };
525
526             SYMBOL:
527             for my $symbol ( keys %$symbol_table_hashref ) {
528                 next SYMBOL if $symbol !~ /\A (\w+):: \z/x;
529                 my $inner_class = $1;
530
531                 next SYMBOL if $inner_class eq 'SUPER';    # skip '*::SUPER'
532
533                 my $class =
534                 $outer_class
535                 ? "${outer_class}::$inner_class"
536                 : $inner_class;
537
538                 if ( $class->isa($super_class) and $class ne $super_class ) {
539                     push @derived_classes, $class;
540                 }
541
542                 next SYMBOL if $class eq 'main';           # skip 'main::*'
543
544                 $find_derived_classes->($class);
545             }
546         };
547
548         my $root_class = q{};
549         $find_derived_classes->($root_class);
550
551         undef $find_derived_classes;
552
553         @derived_classes = sort { $a->isa($b) ? 1 : $b->isa($a) ? -1 : 0 } @derived_classes;
554
555         return @derived_classes;
556     }
557 }
558
559
560 sub linearized_isa {
561     return @{ mro::get_linear_isa( (shift)->name ) };
562 }
563
564 sub class_precedence_list {
565     my $self = shift;
566     my $name = $self->name;
567
568     unless (Class::MOP::IS_RUNNING_ON_5_10()) { 
569         # NOTE:
570         # We need to check for circular inheritance here
571         # if we are are not on 5.10, cause 5.8 detects it 
572         # late. This will do nothing if all is well, and 
573         # blow up otherwise. Yes, it's an ugly hack, better
574         # suggestions are welcome.        
575         # - SL
576         ($name || return)->isa('This is a test for circular inheritance') 
577     }
578
579     # if our mro is c3, we can 
580     # just grab the linear_isa
581     if (mro::get_mro($name) eq 'c3') {
582         return @{ mro::get_linear_isa($name) }
583     }
584     else {
585         # NOTE:
586         # we can't grab the linear_isa for dfs
587         # since it has all the duplicates 
588         # already removed.
589         return (
590             $name,
591             map {
592                 $self->initialize($_)->class_precedence_list()
593             } $self->superclasses()
594         );
595     }
596 }
597
598 ## Methods
599
600 sub add_method {
601     my ($self, $method_name, $method) = @_;
602     (defined $method_name && $method_name)
603         || confess "You must define a method name";
604
605     my $body;
606     if (blessed($method)) {
607         $body = $method->body;
608         if ($method->package_name ne $self->name && 
609             $method->name         ne $method_name) {
610             warn "Hello there, got something for you." 
611                 . " Method says " . $method->package_name . " " . $method->name
612                 . " Class says " . $self->name . " " . $method_name;
613             $method = $method->clone(
614                 package_name => $self->name,
615                 name         => $method_name            
616             ) if $method->can('clone');
617         }
618     }
619     else {
620         $body = $method;
621         ('CODE' eq ref($body))
622             || confess "Your code block must be a CODE reference";
623         $method = $self->method_metaclass->wrap(
624             $body => (
625                 package_name => $self->name,
626                 name         => $method_name
627             )
628         );
629     }
630
631     $method->attach_to_class($self);
632
633     $self->get_method_map->{$method_name} = $method;
634     
635     my $full_method_name = ($self->name . '::' . $method_name);    
636     $self->add_package_symbol(
637         { sigil => '&', type => 'CODE', name => $method_name }, 
638         Class::MOP::subname($full_method_name => $body)
639     );
640
641     $self->update_package_cache_flag; # still valid, since we just added the method to the map, and if it was invalid before that then get_method_map updated it
642 }
643
644 {
645     my $fetch_and_prepare_method = sub {
646         my ($self, $method_name) = @_;
647         # fetch it locally
648         my $method = $self->get_method($method_name);
649         # if we dont have local ...
650         unless ($method) {
651             # try to find the next method
652             $method = $self->find_next_method_by_name($method_name);
653             # die if it does not exist
654             (defined $method)
655                 || confess "The method '$method_name' is not found in the inheritance hierarchy for class " . $self->name;
656             # and now make sure to wrap it
657             # even if it is already wrapped
658             # because we need a new sub ref
659             $method = Class::MOP::Method::Wrapped->wrap($method);
660         }
661         else {
662             # now make sure we wrap it properly
663             $method = Class::MOP::Method::Wrapped->wrap($method)
664                 unless $method->isa('Class::MOP::Method::Wrapped');
665         }
666         $self->add_method($method_name => $method);
667         return $method;
668     };
669
670     sub add_before_method_modifier {
671         my ($self, $method_name, $method_modifier) = @_;
672         (defined $method_name && $method_name)
673             || confess "You must pass in a method name";
674         my $method = $fetch_and_prepare_method->($self, $method_name);
675         $method->add_before_modifier(
676             Class::MOP::subname(':before' => $method_modifier)
677         );
678     }
679
680     sub add_after_method_modifier {
681         my ($self, $method_name, $method_modifier) = @_;
682         (defined $method_name && $method_name)
683             || confess "You must pass in a method name";
684         my $method = $fetch_and_prepare_method->($self, $method_name);
685         $method->add_after_modifier(
686             Class::MOP::subname(':after' => $method_modifier)
687         );
688     }
689
690     sub add_around_method_modifier {
691         my ($self, $method_name, $method_modifier) = @_;
692         (defined $method_name && $method_name)
693             || confess "You must pass in a method name";
694         my $method = $fetch_and_prepare_method->($self, $method_name);
695         $method->add_around_modifier(
696             Class::MOP::subname(':around' => $method_modifier)
697         );
698     }
699
700     # NOTE:
701     # the methods above used to be named like this:
702     #    ${pkg}::${method}:(before|after|around)
703     # but this proved problematic when using one modifier
704     # to wrap multiple methods (something which is likely
705     # to happen pretty regularly IMO). So instead of naming
706     # it like this, I have chosen to just name them purely
707     # with their modifier names, like so:
708     #    :(before|after|around)
709     # The fact is that in a stack trace, it will be fairly
710     # evident from the context what method they are attached
711     # to, and so don't need the fully qualified name.
712 }
713
714 sub alias_method {
715     my ($self, $method_name, $method) = @_;
716     (defined $method_name && $method_name)
717         || confess "You must define a method name";
718
719     my $body = (blessed($method) ? $method->body : $method);
720     ('CODE' eq ref($body))
721         || confess "Your code block must be a CODE reference";
722
723     $self->add_package_symbol(
724         { sigil => '&', type => 'CODE', name => $method_name } => $body
725     );
726 }
727
728 sub has_method {
729     my ($self, $method_name) = @_;
730     (defined $method_name && $method_name)
731         || confess "You must define a method name";
732
733     return 0 unless exists $self->get_method_map->{$method_name};
734     return 1;
735 }
736
737 sub get_method {
738     my ($self, $method_name) = @_;
739     (defined $method_name && $method_name)
740         || confess "You must define a method name";
741
742     # NOTE:
743     # I don't really need this here, because
744     # if the method_map is missing a key it
745     # will just return undef for me now
746     # return unless $self->has_method($method_name);
747
748     return $self->get_method_map->{$method_name};
749 }
750
751 sub remove_method {
752     my ($self, $method_name) = @_;
753     (defined $method_name && $method_name)
754         || confess "You must define a method name";
755
756     my $removed_method = delete $self->get_method_map->{$method_name};
757     
758     $self->remove_package_symbol(
759         { sigil => '&', type => 'CODE', name => $method_name }
760     );
761
762     $removed_method->detach_from_class if $removed_method;
763
764     $self->update_package_cache_flag; # still valid, since we just removed the method from the map
765
766     return $removed_method;
767 }
768
769 sub get_method_list {
770     my $self = shift;
771     keys %{$self->get_method_map};
772 }
773
774 sub find_method_by_name {
775     my ($self, $method_name) = @_;
776     (defined $method_name && $method_name)
777         || confess "You must define a method name to find";
778     foreach my $class ($self->linearized_isa) {
779         # fetch the meta-class ...
780         my $meta = $self->initialize($class);
781         return $meta->get_method($method_name)
782             if $meta->has_method($method_name);
783     }
784     return;
785 }
786
787 sub get_all_methods {
788     my $self = shift;
789     my %methods = map { %{ $self->initialize($_)->get_method_map } } reverse $self->linearized_isa;
790     return values %methods;
791 }
792
793 # compatibility
794 sub compute_all_applicable_methods {
795     return map {
796         {
797             name  => $_->name,
798             class => $_->package_name,
799             code  => $_, # sigh, overloading
800         },
801     } shift->get_all_methods(@_);
802 }
803
804 sub find_all_methods_by_name {
805     my ($self, $method_name) = @_;
806     (defined $method_name && $method_name)
807         || confess "You must define a method name to find";
808     my @methods;
809     foreach my $class ($self->linearized_isa) {
810         # fetch the meta-class ...
811         my $meta = $self->initialize($class);
812         push @methods => {
813             name  => $method_name,
814             class => $class,
815             code  => $meta->get_method($method_name)
816         } if $meta->has_method($method_name);
817     }
818     return @methods;
819 }
820
821 sub find_next_method_by_name {
822     my ($self, $method_name) = @_;
823     (defined $method_name && $method_name)
824         || confess "You must define a method name to find";
825     my @cpl = $self->linearized_isa;
826     shift @cpl; # discard ourselves
827     foreach my $class (@cpl) {
828         # fetch the meta-class ...
829         my $meta = $self->initialize($class);
830         return $meta->get_method($method_name)
831             if $meta->has_method($method_name);
832     }
833     return;
834 }
835
836 ## Attributes
837
838 sub add_attribute {
839     my $self      = shift;
840     # either we have an attribute object already
841     # or we need to create one from the args provided
842     my $attribute = blessed($_[0]) ? $_[0] : $self->attribute_metaclass->new(@_);
843     # make sure it is derived from the correct type though
844     ($attribute->isa('Class::MOP::Attribute'))
845         || confess "Your attribute must be an instance of Class::MOP::Attribute (or a subclass)";
846
847     # first we attach our new attribute
848     # because it might need certain information
849     # about the class which it is attached to
850     $attribute->attach_to_class($self);
851
852     # then we remove attributes of a conflicting
853     # name here so that we can properly detach
854     # the old attr object, and remove any
855     # accessors it would have generated
856     if ( $self->has_attribute($attribute->name) ) {
857         $self->remove_attribute($attribute->name);
858     } else {
859         $self->invalidate_meta_instances();
860     }
861
862     # then onto installing the new accessors
863     $self->get_attribute_map->{$attribute->name} = $attribute;
864
865     # invalidate package flag here
866     my $e = do { local $@; eval { $attribute->install_accessors() }; $@ };
867     if ( $e ) {
868         $self->remove_attribute($attribute->name);
869         die $e;
870     }
871
872     return $attribute;
873 }
874
875 sub update_meta_instance_dependencies {
876     my $self = shift;
877
878     if ( $self->{meta_instance_dependencies} ) {
879         return $self->add_meta_instance_dependencies;
880     }
881 }
882
883 sub add_meta_instance_dependencies {
884     my $self = shift;
885
886     $self->remove_meta_instance_depdendencies;
887
888     my @attrs = $self->compute_all_applicable_attributes();
889
890     my %seen;
891     my @classes = grep { not $seen{$_->name}++ } map { $_->associated_class } @attrs;
892
893     foreach my $class ( @classes ) { 
894         $class->add_dependent_meta_instance($self);
895     }
896
897     $self->{meta_instance_dependencies} = \@classes;
898 }
899
900 sub remove_meta_instance_depdendencies {
901     my $self = shift;
902
903     if ( my $classes = delete $self->{meta_instance_dependencies} ) {
904         foreach my $class ( @$classes ) {
905             $class->remove_dependent_meta_instance($self);
906         }
907
908         return $classes;
909     }
910
911     return;
912
913 }
914
915 sub add_dependent_meta_instance {
916     my ( $self, $metaclass ) = @_;
917     push @{ $self->{dependent_meta_instances} }, $metaclass;
918 }
919
920 sub remove_dependent_meta_instance {
921     my ( $self, $metaclass ) = @_;
922     my $name = $metaclass->name;
923     @$_ = grep { $_->name ne $name } @$_ for $self->{dependent_meta_instances};
924 }
925
926 sub invalidate_meta_instances {
927     my $self = shift;
928     $_->invalidate_meta_instance() for $self, @{ $self->{dependent_meta_instances} };
929 }
930
931 sub invalidate_meta_instance {
932     my $self = shift;
933     undef $self->{_meta_instance};
934 }
935
936 sub has_attribute {
937     my ($self, $attribute_name) = @_;
938     (defined $attribute_name && $attribute_name)
939         || confess "You must define an attribute name";
940     exists $self->get_attribute_map->{$attribute_name};
941 }
942
943 sub get_attribute {
944     my ($self, $attribute_name) = @_;
945     (defined $attribute_name && $attribute_name)
946         || confess "You must define an attribute name";
947     return $self->get_attribute_map->{$attribute_name}
948     # NOTE:
949     # this will return undef anyway, so no need ...
950     #    if $self->has_attribute($attribute_name);
951     #return;
952 }
953
954 sub remove_attribute {
955     my ($self, $attribute_name) = @_;
956     (defined $attribute_name && $attribute_name)
957         || confess "You must define an attribute name";
958     my $removed_attribute = $self->get_attribute_map->{$attribute_name};
959     return unless defined $removed_attribute;
960     delete $self->get_attribute_map->{$attribute_name};
961     $self->invalidate_meta_instances();
962     $removed_attribute->remove_accessors();
963     $removed_attribute->detach_from_class();
964     return $removed_attribute;
965 }
966
967 sub get_attribute_list {
968     my $self = shift;
969     keys %{$self->get_attribute_map};
970 }
971
972 sub get_all_attributes {
973     shift->compute_all_applicable_attributes(@_);
974 }
975
976 sub compute_all_applicable_attributes {
977     my $self = shift;
978     my %attrs = map { %{ $self->initialize($_)->get_attribute_map } } reverse $self->linearized_isa;
979     return values %attrs;
980 }
981
982 sub find_attribute_by_name {
983     my ($self, $attr_name) = @_;
984     foreach my $class ($self->linearized_isa) {
985         # fetch the meta-class ...
986         my $meta = $self->initialize($class);
987         return $meta->get_attribute($attr_name)
988             if $meta->has_attribute($attr_name);
989     }
990     return;
991 }
992
993 ## Class closing
994
995 sub is_mutable   { 1 }
996 sub is_immutable { 0 }
997
998 # NOTE:
999 # Why I changed this (groditi)
1000 #  - One Metaclass may have many Classes through many Metaclass instances
1001 #  - One Metaclass should only have one Immutable Transformer instance
1002 #  - Each Class may have different Immutabilizing options
1003 #  - Therefore each Metaclass instance may have different Immutabilizing options
1004 #  - We need to store one Immutable Transformer instance per Metaclass
1005 #  - We need to store one set of Immutable Transformer options per Class
1006 #  - Upon make_mutable we may delete the Immutabilizing options
1007 #  - We could clean the immutable Transformer instance when there is no more
1008 #      immutable Classes of that type, but we can also keep it in case
1009 #      another class with this same Metaclass becomes immutable. It is a case
1010 #      of trading of storing an instance to avoid unnecessary instantiations of
1011 #      Immutable Transformers. You may view this as a memory leak, however
1012 #      Because we have few Metaclasses, in practice it seems acceptable
1013 #  - To allow Immutable Transformers instances to be cleaned up we could weaken
1014 #      the reference stored in  $IMMUTABLE_TRANSFORMERS{$class} and ||= should DWIM
1015
1016 {
1017
1018     my %IMMUTABLE_TRANSFORMERS;
1019     my %IMMUTABLE_OPTIONS;
1020
1021     sub get_immutable_options {
1022         my $self = shift;
1023         return if $self->is_mutable;
1024         confess "unable to find immutabilizing options"
1025             unless exists $IMMUTABLE_OPTIONS{$self->name};
1026         my %options = %{$IMMUTABLE_OPTIONS{$self->name}};
1027         delete $options{IMMUTABLE_TRANSFORMER};
1028         return \%options;
1029     }
1030
1031     sub get_immutable_transformer {
1032         my $self = shift;
1033         if( $self->is_mutable ){
1034             my $class = ref $self || $self;
1035             return $IMMUTABLE_TRANSFORMERS{$class} ||= $self->create_immutable_transformer;
1036         }
1037         confess "unable to find transformer for immutable class"
1038             unless exists $IMMUTABLE_OPTIONS{$self->name};
1039         return $IMMUTABLE_OPTIONS{$self->name}->{IMMUTABLE_TRANSFORMER};
1040     }
1041
1042     sub make_immutable {
1043         my $self = shift;
1044         my %options = @_;
1045
1046         my $transformer = $self->get_immutable_transformer;
1047         $transformer->make_metaclass_immutable($self, \%options);
1048         $IMMUTABLE_OPTIONS{$self->name} =
1049             { %options,  IMMUTABLE_TRANSFORMER => $transformer };
1050
1051         if( exists $options{debug} && $options{debug} ){
1052             print STDERR "# of Metaclass options:      ", keys %IMMUTABLE_OPTIONS;
1053             print STDERR "# of Immutable transformers: ", keys %IMMUTABLE_TRANSFORMERS;
1054         }
1055
1056         1;
1057     }
1058
1059     sub make_mutable{
1060         my $self = shift;
1061         return if $self->is_mutable;
1062         my $options = delete $IMMUTABLE_OPTIONS{$self->name};
1063         confess "unable to find immutabilizing options" unless ref $options;
1064         my $transformer = delete $options->{IMMUTABLE_TRANSFORMER};
1065         $transformer->make_metaclass_mutable($self, $options);
1066         1;
1067     }
1068 }
1069
1070 sub create_immutable_transformer {
1071     my $self = shift;
1072     my $class = Class::MOP::Immutable->new($self, {
1073         read_only   => [qw/superclasses/],
1074         cannot_call => [qw/
1075            add_method
1076            alias_method
1077            remove_method
1078            add_attribute
1079            remove_attribute
1080            remove_package_symbol
1081         /],
1082         memoize     => {
1083            class_precedence_list             => 'ARRAY',
1084            linearized_isa                    => 'ARRAY',
1085            compute_all_applicable_attributes => 'ARRAY',
1086            get_meta_instance                 => 'SCALAR',
1087            get_method_map                    => 'SCALAR',
1088         },
1089         # NOTE:
1090         # this is ugly, but so are typeglobs, 
1091         # so whattayahgonnadoboutit
1092         # - SL
1093         wrapped => { 
1094             add_package_symbol => sub {
1095                 my $original = shift;
1096                 confess "Cannot add package symbols to an immutable metaclass" 
1097                     unless (caller(2))[3] eq 'Class::MOP::Package::get_package_symbol'; 
1098                 goto $original->body;
1099             },
1100         },
1101     });
1102     return $class;
1103 }
1104
1105 1;
1106
1107 __END__
1108
1109 =pod
1110
1111 =head1 NAME
1112
1113 Class::MOP::Class - Class Meta Object
1114
1115 =head1 SYNOPSIS
1116
1117   # assuming that class Foo
1118   # has been defined, you can
1119
1120   # use this for introspection ...
1121
1122   # add a method to Foo ...
1123   Foo->meta->add_method('bar' => sub { ... })
1124
1125   # get a list of all the classes searched
1126   # the method dispatcher in the correct order
1127   Foo->meta->class_precedence_list()
1128
1129   # remove a method from Foo
1130   Foo->meta->remove_method('bar');
1131
1132   # or use this to actually create classes ...
1133
1134   Class::MOP::Class->create('Bar' => (
1135       version      => '0.01',
1136       superclasses => [ 'Foo' ],
1137       attributes => [
1138           Class::MOP:::Attribute->new('$bar'),
1139           Class::MOP:::Attribute->new('$baz'),
1140       ],
1141       methods => {
1142           calculate_bar => sub { ... },
1143           construct_baz => sub { ... }
1144       }
1145   ));
1146
1147 =head1 DESCRIPTION
1148
1149 This is the largest and currently most complex part of the Perl 5
1150 meta-object protocol. It controls the introspection and
1151 manipulation of Perl 5 classes (and it can create them too). The
1152 best way to understand what this module can do, is to read the
1153 documentation for each of it's methods.
1154
1155 =head1 METHODS
1156
1157 =head2 Self Introspection
1158
1159 =over 4
1160
1161 =item B<meta>
1162
1163 This will return a B<Class::MOP::Class> instance which is related
1164 to this class. Thereby allowing B<Class::MOP::Class> to actually
1165 introspect itself.
1166
1167 As with B<Class::MOP::Attribute>, B<Class::MOP> will actually
1168 bootstrap this module by installing a number of attribute meta-objects
1169 into it's metaclass. This will allow this class to reap all the benifits
1170 of the MOP when subclassing it.
1171
1172 =back
1173
1174 =head2 Class construction
1175
1176 These methods will handle creating B<Class::MOP::Class> objects,
1177 which can be used to both create new classes, and analyze
1178 pre-existing classes.
1179
1180 This module will internally store references to all the instances
1181 you create with these methods, so that they do not need to be
1182 created any more than nessecary. Basically, they are singletons.
1183
1184 =over 4
1185
1186 =item B<create ($package_name,
1187                 version      =E<gt> ?$version,
1188                 authority    =E<gt> ?$authority,
1189                 superclasses =E<gt> ?@superclasses,
1190                 methods      =E<gt> ?%methods,
1191                 attributes   =E<gt> ?%attributes)>
1192
1193 This returns a B<Class::MOP::Class> object, bringing the specified
1194 C<$package_name> into existence and adding any of the C<$version>,
1195 C<$authority>, C<@superclasses>, C<%methods> and C<%attributes> to
1196 it.
1197
1198 =item B<create_anon_class (superclasses =E<gt> ?@superclasses,
1199                            methods      =E<gt> ?%methods,
1200                            attributes   =E<gt> ?%attributes)>
1201
1202 This will create an anonymous class, it works much like C<create> but
1203 it does not need a C<$package_name>. Instead it will create a suitably
1204 unique package name for you to stash things into.
1205
1206 On very important distinction is that anon classes are destroyed once
1207 the metaclass they are attached to goes out of scope. In the DESTROY
1208 method, the created package will be removed from the symbol table.
1209
1210 It is also worth noting that any instances created with an anon-class
1211 will keep a special reference to the anon-meta which will prevent the
1212 anon-class from going out of scope until all instances of it have also
1213 been destroyed. This however only works for HASH based instance types,
1214 as we use a special reserved slot (C<__MOP__>) to store this.
1215
1216 =item B<initialize ($package_name, %options)>
1217
1218 This initializes and returns returns a B<Class::MOP::Class> object
1219 for a given a C<$package_name>.
1220
1221 =item B<reinitialize ($package_name, %options)>
1222
1223 This removes the old metaclass, and creates a new one in it's place.
1224 Do B<not> use this unless you really know what you are doing, it could
1225 very easily make a very large mess of your program.
1226
1227 =item B<construct_class_instance (%options)>
1228
1229 This will construct an instance of B<Class::MOP::Class>, it is
1230 here so that we can actually "tie the knot" for B<Class::MOP::Class>
1231 to use C<construct_instance> once all the bootstrapping is done. This
1232 method is used internally by C<initialize> and should never be called
1233 from outside of that method really.
1234
1235 =item B<check_metaclass_compatability>
1236
1237 This method is called as the very last thing in the
1238 C<construct_class_instance> method. This will check that the
1239 metaclass you are creating is compatible with the metaclasses of all
1240 your ancestors. For more inforamtion about metaclass compatibility
1241 see the C<About Metaclass compatibility> section in L<Class::MOP>.
1242
1243 =item B<update_package_cache_flag>
1244
1245 This will reset the package cache flag for this particular metaclass
1246 it is basically the value of the C<Class::MOP::get_package_cache_flag> 
1247 function. This is very rarely needed from outside of C<Class::MOP::Class>
1248 but in some cases you might want to use it, so it is here.
1249
1250 =item B<reset_package_cache_flag>
1251
1252 Clears the package cache flag to announce to the internals that we need 
1253 to rebuild the method map.
1254
1255 =item B<add_meta_instance_dependencies>
1256
1257 Registers this class as dependent on its superclasses.
1258
1259 Only superclasses from which this class inherits attributes will be added.
1260
1261 =item B<remove_meta_instance_depdendencies>
1262
1263 Unregisters this class from its superclasses.
1264
1265 =item B<update_meta_instance_dependencies>
1266
1267 Reregisters if necessary.
1268
1269 =item B<add_dependent_meta_instance> $metaclass
1270
1271 Registers the class as having a meta instance dependent on this class.
1272
1273 =item B<remove_dependent_meta_instance> $metaclass
1274
1275 Remove the class from the list of dependent classes.
1276
1277 =item B<invalidate_meta_instances>
1278
1279 Clears the cached meta instance for this metaclass and all of the registered
1280 classes with dependent meta instances.
1281
1282 Called by C<add_attribute> and C<remove_attribute> to recalculate the attribute
1283 slots.
1284
1285 =item B<invalidate_meta_instance>
1286
1287 Used by C<invalidate_meta_instances>.
1288
1289 =back
1290
1291 =head2 Object instance construction and cloning
1292
1293 These methods are B<entirely optional>, it is up to you whether you want
1294 to use them or not.
1295
1296 =over 4
1297
1298 =item B<instance_metaclass>
1299
1300 Returns the class name of the instance metaclass, see L<Class::MOP::Instance> 
1301 for more information on the instance metaclasses.
1302
1303 =item B<get_meta_instance>
1304
1305 Returns an instance of L<Class::MOP::Instance> to be used in the construction 
1306 of a new instance of the class. 
1307
1308 =item B<create_meta_instance>
1309
1310 Called by C<get_meta_instance> if necessary.
1311
1312 =item B<new_object (%params)>
1313
1314 This is a convience method for creating a new object of the class, and
1315 blessing it into the appropriate package as well. Ideally your class
1316 would call a C<new> this method like so:
1317
1318   sub MyClass::new {
1319       my ($class, %param) = @_;
1320       $class->meta->new_object(%params);
1321   }
1322
1323 =item B<construct_instance (%params)>
1324
1325 This method is used to construct an instance structure suitable for
1326 C<bless>-ing into your package of choice. It works in conjunction
1327 with the Attribute protocol to collect all applicable attributes.
1328
1329 This will construct and instance using a HASH ref as storage
1330 (currently only HASH references are supported). This will collect all
1331 the applicable attributes and layout out the fields in the HASH ref,
1332 it will then initialize them using either use the corresponding key
1333 in C<%params> or any default value or initializer found in the
1334 attribute meta-object.
1335
1336 =item B<clone_object ($instance, %params)>
1337
1338 This is a convience method for cloning an object instance, then
1339 blessing it into the appropriate package. This method will call
1340 C<clone_instance>, which performs a shallow copy of the object,
1341 see that methods documentation for more details. Ideally your
1342 class would call a C<clone> this method like so:
1343
1344   sub MyClass::clone {
1345       my ($self, %param) = @_;
1346       $self->meta->clone_object($self, %params);
1347   }
1348
1349 =item B<clone_instance($instance, %params)>
1350
1351 This method is a compliment of C<construct_instance> (which means if
1352 you override C<construct_instance>, you need to override this one too),
1353 and clones the instance shallowly.
1354
1355 The cloned structure returned is (like with C<construct_instance>) an
1356 unC<bless>ed HASH reference, it is your responsibility to then bless
1357 this cloned structure into the right class (which C<clone_object> will
1358 do for you).
1359
1360 As of 0.11, this method will clone the C<$instance> structure shallowly,
1361 as opposed to the deep cloning implemented in prior versions. After much
1362 thought, research and discussion, I have decided that anything but basic
1363 shallow cloning is outside the scope of the meta-object protocol. I
1364 think Yuval "nothingmuch" Kogman put it best when he said that cloning
1365 is too I<context-specific> to be part of the MOP.
1366
1367 =item B<rebless_instance($instance, ?%params)>
1368
1369 This will change the class of C<$instance> to the class of the invoking
1370 C<Class::MOP::Class>. You may only rebless the instance to a subclass of
1371 itself. You may pass in optional C<%params> which are like constructor 
1372 params and will override anything already defined in the instance.
1373
1374 =back
1375
1376 =head2 Informational
1377
1378 These are a few predicate methods for asking information about the class.
1379
1380 =over 4
1381
1382 =item B<is_anon_class>
1383
1384 This returns true if the class is a C<Class::MOP::Class> created anon class.
1385
1386 =item B<is_mutable>
1387
1388 This returns true if the class is still mutable.
1389
1390 =item B<is_immutable>
1391
1392 This returns true if the class has been made immutable.
1393
1394 =back
1395
1396 =head2 Inheritance Relationships
1397
1398 =over 4
1399
1400 =item B<superclasses (?@superclasses)>
1401
1402 This is a read-write attribute which represents the superclass
1403 relationships of the class the B<Class::MOP::Class> instance is
1404 associated with. Basically, it can get and set the C<@ISA> for you.
1405
1406 =item B<class_precedence_list>
1407
1408 This computes the a list of all the class's ancestors in the same order
1409 in which method dispatch will be done. This is similair to what 
1410 B<Class::ISA::super_path> does, but we don't remove duplicate names.
1411
1412 =item B<linearized_isa>
1413
1414 This returns a list based on C<class_precedence_list> but with all 
1415 duplicates removed.
1416
1417 =item B<subclasses>
1418
1419 This returns a list of subclasses for this class. 
1420
1421 =back
1422
1423 =head2 Methods
1424
1425 =over 4
1426
1427 =item B<get_method_map>
1428
1429 Returns a HASH ref of name to CODE reference mapping for this class.
1430
1431 =item B<method_metaclass>
1432
1433 Returns the class name of the method metaclass, see L<Class::MOP::Method> 
1434 for more information on the method metaclasses.
1435
1436 =item B<add_method ($method_name, $method)>
1437
1438 This will take a C<$method_name> and CODE reference to that
1439 C<$method> and install it into the class's package.
1440
1441 B<NOTE>:
1442 This does absolutely nothing special to C<$method>
1443 other than use B<Sub::Name> to make sure it is tagged with the
1444 correct name, and therefore show up correctly in stack traces and
1445 such.
1446
1447 =item B<alias_method ($method_name, $method)>
1448
1449 This will take a C<$method_name> and CODE reference to that
1450 C<$method> and alias the method into the class's package.
1451
1452 B<NOTE>:
1453 Unlike C<add_method>, this will B<not> try to name the
1454 C<$method> using B<Sub::Name>, it only aliases the method in
1455 the class's package.
1456
1457 =item B<has_method ($method_name)>
1458
1459 This just provides a simple way to check if the class implements
1460 a specific C<$method_name>. It will I<not> however, attempt to check
1461 if the class inherits the method (use C<UNIVERSAL::can> for that).
1462
1463 This will correctly handle functions defined outside of the package
1464 that use a fully qualified name (C<sub Package::name { ... }>).
1465
1466 This will correctly handle functions renamed with B<Sub::Name> and
1467 installed using the symbol tables. However, if you are naming the
1468 subroutine outside of the package scope, you must use the fully
1469 qualified name, including the package name, for C<has_method> to
1470 correctly identify it.
1471
1472 This will attempt to correctly ignore functions imported from other
1473 packages using B<Exporter>. It breaks down if the function imported
1474 is an C<__ANON__> sub (such as with C<use constant>), which very well
1475 may be a valid method being applied to the class.
1476
1477 In short, this method cannot always be trusted to determine if the
1478 C<$method_name> is actually a method. However, it will DWIM about
1479 90% of the time, so it's a small trade off I think.
1480
1481 =item B<get_method ($method_name)>
1482
1483 This will return a Class::MOP::Method instance related to the specified
1484 C<$method_name>, or return undef if that method does not exist.
1485
1486 The Class::MOP::Method is codifiable, so you can use it like a normal
1487 CODE reference, see L<Class::MOP::Method> for more information.
1488
1489 =item B<find_method_by_name ($method_name)>
1490
1491 This will return a CODE reference of the specified C<$method_name>,
1492 or return undef if that method does not exist.
1493
1494 Unlike C<get_method> this will also look in the superclasses.
1495
1496 =item B<remove_method ($method_name)>
1497
1498 This will attempt to remove a given C<$method_name> from the class.
1499 It will return the CODE reference that it has removed, and will
1500 attempt to use B<Sub::Name> to clear the methods associated name.
1501
1502 =item B<get_method_list>
1503
1504 This will return a list of method names for all I<locally> defined
1505 methods. It does B<not> provide a list of all applicable methods,
1506 including any inherited ones. If you want a list of all applicable
1507 methods, use the C<compute_all_applicable_methods> method.
1508
1509 =item B<get_all_methods>
1510
1511 This will traverse the inheritance heirachy and return a list of all
1512 the applicable L<Class::MOP::Method> objects for this class.
1513
1514 =item B<compute_all_applicable_methods>
1515
1516 Deprecated.
1517
1518 This method returns a list of hashes describing the all the methods of the
1519 class.
1520
1521 Use L<get_all_methods>, which is easier/better/faster. This method predates
1522 L<Class::MOP::Method>.
1523
1524 =item B<find_all_methods_by_name ($method_name)>
1525
1526 This will traverse the inheritence hierarchy and locate all methods
1527 with a given C<$method_name>. Similar to
1528 C<compute_all_applicable_methods> it returns a list of HASH references
1529 with the following information; method name (which will always be the
1530 same as C<$method_name>), the name of the class in which the method
1531 lives and a CODE reference for the actual method.
1532
1533 The list of methods produced is a distinct list, meaning there are no
1534 duplicates in it. This is especially useful for things like object
1535 initialization and destruction where you only want the method called
1536 once, and in the correct order.
1537
1538 =item B<find_next_method_by_name ($method_name)>
1539
1540 This will return the first method to match a given C<$method_name> in
1541 the superclasses, this is basically equivalent to calling
1542 C<SUPER::$method_name>, but it can be dispatched at runtime.
1543
1544 =back
1545
1546 =head2 Method Modifiers
1547
1548 Method modifiers are a concept borrowed from CLOS, in which a method
1549 can be wrapped with I<before>, I<after> and I<around> method modifiers
1550 that will be called everytime the method is called.
1551
1552 =head3 How method modifiers work?
1553
1554 Method modifiers work by wrapping the original method and then replacing
1555 it in the classes symbol table. The wrappers will handle calling all the
1556 modifiers in the appropariate orders and preserving the calling context
1557 for the original method.
1558
1559 Each method modifier serves a particular purpose, which may not be
1560 obvious to users of other method wrapping modules. To start with, the
1561 return values of I<before> and I<after> modifiers are ignored. This is
1562 because thier purpose is B<not> to filter the input and output of the
1563 primary method (this is done with an I<around> modifier). This may seem
1564 like an odd restriction to some, but doing this allows for simple code
1565 to be added at the begining or end of a method call without jeapordizing
1566 the normal functioning of the primary method or placing any extra
1567 responsibility on the code of the modifier. Of course if you have more
1568 complex needs, then use the I<around> modifier, which uses a variation
1569 of continutation passing style to allow for a high degree of flexibility.
1570
1571 Before and around modifiers are called in last-defined-first-called order,
1572 while after modifiers are called in first-defined-first-called order. So
1573 the call tree might looks something like this:
1574
1575   before 2
1576    before 1
1577     around 2
1578      around 1
1579       primary
1580      after 1
1581     after 2
1582
1583 To see examples of using method modifiers, see the following examples
1584 included in the distribution; F<InstanceCountingClass>, F<Perl6Attribute>,
1585 F<AttributesWithHistory> and F<C3MethodDispatchOrder>. There is also a
1586 classic CLOS usage example in the test F<017_add_method_modifier.t>.
1587
1588 =head3 What is the performance impact?
1589
1590 Of course there is a performance cost associated with method modifiers,
1591 but we have made every effort to make that cost be directly proportional
1592 to the amount of modifier features you utilize.
1593
1594 The wrapping method does it's best to B<only> do as much work as it
1595 absolutely needs to. In order to do this we have moved some of the
1596 performance costs to set-up time, where they are easier to amortize.
1597
1598 All this said, my benchmarks have indicated the following:
1599
1600   simple wrapper with no modifiers             100% slower
1601   simple wrapper with simple before modifier   400% slower
1602   simple wrapper with simple after modifier    450% slower
1603   simple wrapper with simple around modifier   500-550% slower
1604   simple wrapper with all 3 modifiers          1100% slower
1605
1606 These numbers may seem daunting, but you must remember, every feature
1607 comes with some cost. To put things in perspective, just doing a simple
1608 C<AUTOLOAD> which does nothing but extract the name of the method called
1609 and return it costs about 400% over a normal method call.
1610
1611 =over 4
1612
1613 =item B<add_before_method_modifier ($method_name, $code)>
1614
1615 This will wrap the method at C<$method_name> and the supplied C<$code>
1616 will be passed the C<@_> arguments, and called before the original
1617 method is called. As specified above, the return value of the I<before>
1618 method modifiers is ignored, and it's ability to modify C<@_> is
1619 fairly limited. If you need to do either of these things, use an
1620 C<around> method modifier.
1621
1622 =item B<add_after_method_modifier ($method_name, $code)>
1623
1624 This will wrap the method at C<$method_name> so that the original
1625 method will be called, it's return values stashed, and then the
1626 supplied C<$code> will be passed the C<@_> arguments, and called.
1627 As specified above, the return value of the I<after> method
1628 modifiers is ignored, and it cannot modify the return values of
1629 the original method. If you need to do either of these things, use an
1630 C<around> method modifier.
1631
1632 =item B<add_around_method_modifier ($method_name, $code)>
1633
1634 This will wrap the method at C<$method_name> so that C<$code>
1635 will be called and passed the original method as an extra argument
1636 at the begining of the C<@_> argument list. This is a variation of
1637 continuation passing style, where the function prepended to C<@_>
1638 can be considered a continuation. It is up to C<$code> if it calls
1639 the original method or not, there is no restriction on what the
1640 C<$code> can or cannot do.
1641
1642 =back
1643
1644 =head2 Attributes
1645
1646 It should be noted that since there is no one consistent way to define
1647 the attributes of a class in Perl 5. These methods can only work with
1648 the information given, and can not easily discover information on
1649 their own. See L<Class::MOP::Attribute> for more details.
1650
1651 =over 4
1652
1653 =item B<attribute_metaclass>
1654
1655 Returns the class name of the attribute metaclass, see L<Class::MOP::Attribute> 
1656 for more information on the attribute metaclasses.
1657
1658 =item B<get_attribute_map>
1659
1660 This returns a HASH ref of name to attribute meta-object mapping.
1661
1662 =item B<add_attribute ($attribute_meta_object | ($attribute_name, %attribute_spec))>
1663
1664 This stores the C<$attribute_meta_object> (or creates one from the
1665 C<$attribute_name> and C<%attribute_spec>) in the B<Class::MOP::Class>
1666 instance associated with the given class. Unlike methods, attributes
1667 within the MOP are stored as meta-information only. They will be used
1668 later to construct instances from (see C<construct_instance> above).
1669 More details about the attribute meta-objects can be found in the
1670 L<Class::MOP::Attribute> or the L<Class::MOP/The Attribute protocol>
1671 section.
1672
1673 It should be noted that any accessor, reader/writer or predicate
1674 methods which the C<$attribute_meta_object> has will be installed
1675 into the class at this time.
1676
1677 B<NOTE>
1678 If an attribute already exists for C<$attribute_name>, the old one
1679 will be removed (as well as removing all it's accessors), and then
1680 the new one added.
1681
1682 =item B<has_attribute ($attribute_name)>
1683
1684 Checks to see if this class has an attribute by the name of
1685 C<$attribute_name> and returns a boolean.
1686
1687 =item B<get_attribute ($attribute_name)>
1688
1689 Returns the attribute meta-object associated with C<$attribute_name>,
1690 if none is found, it will return undef.
1691
1692 =item B<remove_attribute ($attribute_name)>
1693
1694 This will remove the attribute meta-object stored at
1695 C<$attribute_name>, then return the removed attribute meta-object.
1696
1697 B<NOTE:>
1698 Removing an attribute will only affect future instances of
1699 the class, it will not make any attempt to remove the attribute from
1700 any existing instances of the class.
1701
1702 It should be noted that any accessor, reader/writer or predicate
1703 methods which the attribute meta-object stored at C<$attribute_name>
1704 has will be removed from the class at this time. This B<will> make
1705 these attributes somewhat inaccessable in previously created
1706 instances. But if you are crazy enough to do this at runtime, then
1707 you are crazy enough to deal with something like this :).
1708
1709 =item B<get_attribute_list>
1710
1711 This returns a list of attribute names which are defined in the local
1712 class. If you want a list of all applicable attributes for a class,
1713 use the C<compute_all_applicable_attributes> method.
1714
1715 =item B<compute_all_applicable_attributes>
1716
1717 =item B<get_all_attributes>
1718
1719 This will traverse the inheritance heirachy and return a list of all
1720 the applicable L<Class::MOP::Attribute> objects for this class.
1721
1722 C<get_all_attributes> is an alias for consistency with C<get_all_methods>.
1723
1724 =item B<find_attribute_by_name ($attr_name)>
1725
1726 This method will traverse the inheritance heirachy and find the
1727 first attribute whose name matches C<$attr_name>, then return it.
1728 It will return undef if nothing is found.
1729
1730 =back
1731
1732 =head2 Class Immutability
1733
1734 =over 4
1735
1736 =item B<make_immutable (%options)>
1737
1738 This method will invoke a tranforamtion upon the class which will
1739 make it immutable. Details of this transformation can be found in
1740 the L<Class::MOP::Immutable> documentation.
1741
1742 =item B<make_mutable>
1743
1744 This method will reverse tranforamtion upon the class which
1745 made it immutable.
1746
1747 =item B<get_immutable_transformer>
1748
1749 Return a transformer suitable for making this class immutable or, if this
1750 class is immutable, the transformer used to make it immutable.
1751
1752 =item B<get_immutable_options>
1753
1754 If the class is immutable, return the options used to make it immutable.
1755
1756 =item B<create_immutable_transformer>
1757
1758 Create a transformer suitable for making this class immutable
1759
1760 =back
1761
1762 =head1 AUTHORS
1763
1764 Stevan Little E<lt>stevan@iinteractive.comE<gt>
1765
1766 =head1 COPYRIGHT AND LICENSE
1767
1768 Copyright 2006-2008 by Infinity Interactive, Inc.
1769
1770 L<http://www.iinteractive.com>
1771
1772 This library is free software; you can redistribute it and/or modify
1773 it under the same terms as Perl itself.
1774
1775 =cut