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