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