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