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