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