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