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