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