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