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