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