improve get_package_variable;
[gitmo/Class-MOP.git] / lib / Class / MOP / Class.pm
CommitLineData
8b978dd5 1
2package Class::MOP::Class;
3
4use strict;
5use warnings;
6
7use Carp 'confess';
0882828e 8use Scalar::Util 'blessed', 'reftype';
8b978dd5 9use Sub::Name 'subname';
10use B 'svref_2object';
a740253a 11use Clone ();
8b978dd5 12
0dea7280 13our $VERSION = '0.05';
8b978dd5 14
aa448b16 15# Self-introspection
2eb717d5 16
aa448b16 17sub meta { Class::MOP::Class->initialize(blessed($_[0]) || $_[0]) }
2eb717d5 18
8b978dd5 19# Creation
20
bfe4d0fc 21{
22 # Metaclasses are singletons, so we cache them here.
23 # there is no need to worry about destruction though
24 # because they should die only when the program dies.
25 # After all, do package definitions even get reaped?
651955fb 26 my %METAS;
27
bfe4d0fc 28 sub initialize {
351bd7d4 29 my $class = shift;
30 my $package_name = shift;
22286063 31 (defined $package_name && $package_name && !blessed($package_name))
32 || confess "You must pass a package name and it cannot be blessed";
651955fb 33 $class->construct_class_instance(':package' => $package_name, @_);
727919c5 34 }
35
36 # NOTE: (meta-circularity)
37 # this is a special form of &construct_instance
38 # (see below), which is used to construct class
1a7ebbb3 39 # meta-object instances for any Class::MOP::*
40 # class. All other classes will use the more
41 # normal &construct_instance.
727919c5 42 sub construct_class_instance {
351bd7d4 43 my $class = shift;
651955fb 44 my %options = @_;
45 my $package_name = $options{':package'};
727919c5 46 (defined $package_name && $package_name)
651955fb 47 || confess "You must pass a package name";
48 return $METAS{$package_name} if exists $METAS{$package_name};
1a7ebbb3 49 $class = blessed($class) || $class;
550d56db 50 # now create the metaclass
51 my $meta;
1a7ebbb3 52 if ($class =~ /^Class::MOP::/) {
550d56db 53 $meta = bless {
351bd7d4 54 '$:package' => $package_name,
55 '%:attributes' => {},
550d56db 56 '$:attribute_metaclass' => $options{':attribute_metaclass'} || 'Class::MOP::Attribute',
57 '$:method_metaclass' => $options{':method_metaclass'} || 'Class::MOP::Method',
1a7ebbb3 58 } => $class;
59 }
60 else {
5f3c057a 61 # NOTE:
62 # it is safe to use meta here because
63 # class will always be a subclass of
64 # Class::MOP::Class, which defines meta
550d56db 65 $meta = bless $class->meta->construct_instance(%options) => $class
1a7ebbb3 66 }
550d56db 67 # and check the metaclass compatibility
68 $meta->check_metaclass_compatability();
69 $METAS{$package_name} = $meta;
70 }
71
72 sub check_metaclass_compatability {
73 my $self = shift;
74
75 # this is always okay ...
76 return if blessed($self) eq 'Class::MOP::Class';
77
78 my @class_list = $self->class_precedence_list;
79 shift @class_list; # shift off $self->name
80
81 foreach my $class_name (@class_list) {
550d56db 82 my $meta = $METAS{$class_name};
83 ($self->isa(blessed($meta)))
84 || confess $self->name . "->meta => (" . (blessed($self)) . ")" .
85 " is not compatible with the " .
86 $class_name . "->meta => (" . (blessed($meta)) . ")";
87 }
bfe4d0fc 88 }
8b978dd5 89}
90
91sub create {
92 my ($class, $package_name, $package_version, %options) = @_;
bfe4d0fc 93 (defined $package_name && $package_name)
8b978dd5 94 || confess "You must pass a package name";
95 my $code = "package $package_name;";
96 $code .= "\$$package_name\:\:VERSION = '$package_version';"
97 if defined $package_version;
98 eval $code;
99 confess "creation of $package_name failed : $@" if $@;
bfe4d0fc 100 my $meta = $class->initialize($package_name);
aa448b16 101
102 $meta->add_method('meta' => sub {
103 Class::MOP::Class->initialize(blessed($_[0]) || $_[0]);
104 });
105
8b978dd5 106 $meta->superclasses(@{$options{superclasses}})
107 if exists $options{superclasses};
2eb717d5 108 # NOTE:
109 # process attributes first, so that they can
110 # install accessors, but locally defined methods
111 # can then overwrite them. It is maybe a little odd, but
112 # I think this should be the order of things.
113 if (exists $options{attributes}) {
cbd9f942 114 foreach my $attr (@{$options{attributes}}) {
115 $meta->add_attribute($attr);
2eb717d5 116 }
117 }
bfe4d0fc 118 if (exists $options{methods}) {
119 foreach my $method_name (keys %{$options{methods}}) {
120 $meta->add_method($method_name, $options{methods}->{$method_name});
121 }
2eb717d5 122 }
8b978dd5 123 return $meta;
124}
125
7b31baf4 126## Attribute readers
127
128# NOTE:
129# all these attribute readers will be bootstrapped
130# away in the Class::MOP bootstrap section
131
132sub name { $_[0]->{'$:package'} }
133sub get_attribute_map { $_[0]->{'%:attributes'} }
134sub attribute_metaclass { $_[0]->{'$:attribute_metaclass'} }
135sub method_metaclass { $_[0]->{'$:method_metaclass'} }
136
c9e77dbb 137# Instance Construction & Cloning
138
5f3c057a 139sub new_object {
140 my $class = shift;
651955fb 141 # NOTE:
142 # we need to protect the integrity of the
143 # Class::MOP::Class singletons here, so we
144 # delegate this to &construct_class_instance
145 # which will deal with the singletons
146 return $class->construct_class_instance(@_)
147 if $class->name->isa('Class::MOP::Class');
5f3c057a 148 bless $class->construct_instance(@_) => $class->name;
149}
e16da3e6 150
151sub construct_instance {
cbd9f942 152 my ($class, %params) = @_;
153 my $instance = {};
c9e77dbb 154 foreach my $attr ($class->compute_all_applicable_attributes()) {
651955fb 155 my $init_arg = $attr->init_arg();
cbd9f942 156 # try to fetch the init arg from the %params ...
157 my $val;
158 $val = $params{$init_arg} if exists $params{$init_arg};
159 # if nothing was in the %params, we can use the
160 # attribute's default value (if it has one)
c9e77dbb 161 $val ||= $attr->default($instance) if $attr->has_default();
cbd9f942 162 $instance->{$attr->name} = $val;
163 }
164 return $instance;
e16da3e6 165}
166
5f3c057a 167sub clone_object {
168 my $class = shift;
7b31baf4 169 my $instance = shift;
651955fb 170 (blessed($instance) && $instance->isa($class->name))
171 || confess "You must pass an instance ($instance) of the metaclass (" . $class->name . ")";
172 # NOTE:
173 # we need to protect the integrity of the
174 # Class::MOP::Class singletons here, they
a740253a 175 # should not be cloned.
651955fb 176 return $instance if $instance->isa('Class::MOP::Class');
177 bless $class->clone_instance($instance, @_) => blessed($instance);
5f3c057a 178}
179
c9e77dbb 180sub clone_instance {
651955fb 181 my ($class, $instance, %params) = @_;
182 (blessed($instance))
c9e77dbb 183 || confess "You can only clone instances, \$self is not a blessed instance";
19d4b5b8 184 my $clone = { %$instance, %params };
c9e77dbb 185 return $clone;
186}
187
8b978dd5 188# Informational
189
7b31baf4 190# &name should be here too, but it is above
191# because it gets bootstrapped away
8b978dd5 192
193sub version {
194 my $self = shift;
195 no strict 'refs';
196 ${$self->name . '::VERSION'};
197}
198
199# Inheritance
200
201sub superclasses {
202 my $self = shift;
203 no strict 'refs';
204 if (@_) {
205 my @supers = @_;
206 @{$self->name . '::ISA'} = @supers;
207 }
208 @{$self->name . '::ISA'};
209}
210
211sub class_precedence_list {
212 my $self = shift;
bfe4d0fc 213 # NOTE:
214 # We need to check for ciruclar inheirtance here.
215 # This will do nothing if all is well, and blow
216 # up otherwise. Yes, it's an ugly hack, better
217 # suggestions are welcome.
218 { $self->name->isa('This is a test for circular inheritance') }
219 # ... and no back to our regularly scheduled program
8b978dd5 220 (
221 $self->name,
222 map {
bfe4d0fc 223 $self->initialize($_)->class_precedence_list()
8b978dd5 224 } $self->superclasses()
225 );
226}
227
0882828e 228## Methods
229
230sub add_method {
231 my ($self, $method_name, $method) = @_;
232 (defined $method_name && $method_name)
233 || confess "You must define a method name";
a5eca695 234 # use reftype here to allow for blessed subs ...
0882828e 235 (reftype($method) && reftype($method) eq 'CODE')
236 || confess "Your code block must be a CODE reference";
237 my $full_method_name = ($self->name . '::' . $method_name);
238
239 no strict 'refs';
c9b8b7f9 240 no warnings 'redefine';
22286063 241 *{$full_method_name} = subname $full_method_name => $method;
0882828e 242}
243
663f8198 244sub alias_method {
245 my ($self, $method_name, $method) = @_;
246 (defined $method_name && $method_name)
247 || confess "You must define a method name";
248 # use reftype here to allow for blessed subs ...
249 (reftype($method) && reftype($method) eq 'CODE')
250 || confess "Your code block must be a CODE reference";
251 my $full_method_name = ($self->name . '::' . $method_name);
252
253 no strict 'refs';
254 no warnings 'redefine';
255 *{$full_method_name} = $method;
256}
257
bfe4d0fc 258{
259
260 ## private utility functions for has_method
2eb717d5 261 my $_find_subroutine_package_name = sub { eval { svref_2object($_[0])->GV->STASH->NAME } || '' };
262 my $_find_subroutine_name = sub { eval { svref_2object($_[0])->GV->NAME } || '' };
bfe4d0fc 263
264 sub has_method {
c9b8b7f9 265 my ($self, $method_name) = @_;
bfe4d0fc 266 (defined $method_name && $method_name)
267 || confess "You must define a method name";
0882828e 268
bfe4d0fc 269 my $sub_name = ($self->name . '::' . $method_name);
0882828e 270
bfe4d0fc 271 no strict 'refs';
272 return 0 if !defined(&{$sub_name});
273 return 0 if $_find_subroutine_package_name->(\&{$sub_name}) ne $self->name &&
274 $_find_subroutine_name->(\&{$sub_name}) ne '__ANON__';
275 return 1;
276 }
277
0882828e 278}
279
280sub get_method {
c9b8b7f9 281 my ($self, $method_name) = @_;
0882828e 282 (defined $method_name && $method_name)
283 || confess "You must define a method name";
284
285 no strict 'refs';
286 return \&{$self->name . '::' . $method_name}
bfe4d0fc 287 if $self->has_method($method_name);
c9b8b7f9 288 return; # <- make sure to return undef
289}
290
291sub remove_method {
292 my ($self, $method_name) = @_;
293 (defined $method_name && $method_name)
294 || confess "You must define a method name";
295
296 my $removed_method = $self->get_method($method_name);
297
298 no strict 'refs';
299 delete ${$self->name . '::'}{$method_name}
300 if defined $removed_method;
301
302 return $removed_method;
303}
304
305sub get_method_list {
306 my $self = shift;
307 no strict 'refs';
a5eca695 308 grep { $self->has_method($_) } %{$self->name . '::'};
309}
310
311sub compute_all_applicable_methods {
312 my $self = shift;
313 my @methods;
314 # keep a record of what we have seen
315 # here, this will handle all the
316 # inheritence issues because we are
317 # using the &class_precedence_list
318 my (%seen_class, %seen_method);
319 foreach my $class ($self->class_precedence_list()) {
320 next if $seen_class{$class};
321 $seen_class{$class}++;
322 # fetch the meta-class ...
323 my $meta = $self->initialize($class);
324 foreach my $method_name ($meta->get_method_list()) {
325 next if exists $seen_method{$method_name};
326 $seen_method{$method_name}++;
327 push @methods => {
328 name => $method_name,
329 class => $class,
330 code => $meta->get_method($method_name)
331 };
332 }
333 }
334 return @methods;
335}
336
a5eca695 337sub find_all_methods_by_name {
338 my ($self, $method_name) = @_;
339 (defined $method_name && $method_name)
340 || confess "You must define a method name to find";
341 my @methods;
342 # keep a record of what we have seen
343 # here, this will handle all the
344 # inheritence issues because we are
345 # using the &class_precedence_list
346 my %seen_class;
347 foreach my $class ($self->class_precedence_list()) {
348 next if $seen_class{$class};
349 $seen_class{$class}++;
350 # fetch the meta-class ...
aa448b16 351 my $meta = $self->initialize($class);;
a5eca695 352 push @methods => {
353 name => $method_name,
354 class => $class,
355 code => $meta->get_method($method_name)
356 } if $meta->has_method($method_name);
357 }
358 return @methods;
359
8b978dd5 360}
361
552e3d24 362## Attributes
363
e16da3e6 364sub add_attribute {
2e41896e 365 my $self = shift;
366 # either we have an attribute object already
367 # or we need to create one from the args provided
368 my $attribute = blessed($_[0]) ? $_[0] : $self->attribute_metaclass->new(@_);
369 # make sure it is derived from the correct type though
370 ($attribute->isa('Class::MOP::Attribute'))
371 || confess "Your attribute must be an instance of Class::MOP::Attribute (or a subclass)";
9ec169fe 372 $attribute->attach_to_class($self);
373 $attribute->install_accessors();
7b31baf4 374 $self->get_attribute_map->{$attribute->name} = $attribute;
e16da3e6 375}
376
377sub has_attribute {
378 my ($self, $attribute_name) = @_;
379 (defined $attribute_name && $attribute_name)
380 || confess "You must define an attribute name";
7b31baf4 381 exists $self->get_attribute_map->{$attribute_name} ? 1 : 0;
e16da3e6 382}
383
384sub get_attribute {
385 my ($self, $attribute_name) = @_;
386 (defined $attribute_name && $attribute_name)
387 || confess "You must define an attribute name";
7b31baf4 388 return $self->get_attribute_map->{$attribute_name}
22286063 389 if $self->has_attribute($attribute_name);
390 return;
e16da3e6 391}
392
393sub remove_attribute {
394 my ($self, $attribute_name) = @_;
395 (defined $attribute_name && $attribute_name)
396 || confess "You must define an attribute name";
7b31baf4 397 my $removed_attribute = $self->get_attribute_map->{$attribute_name};
22286063 398 return unless defined $removed_attribute;
399 delete $self->get_attribute_map->{$attribute_name};
9ec169fe 400 $removed_attribute->remove_accessors();
401 $removed_attribute->detach_from_class();
e16da3e6 402 return $removed_attribute;
403}
404
405sub get_attribute_list {
406 my $self = shift;
7b31baf4 407 keys %{$self->get_attribute_map};
e16da3e6 408}
409
410sub compute_all_applicable_attributes {
411 my $self = shift;
412 my @attrs;
413 # keep a record of what we have seen
414 # here, this will handle all the
415 # inheritence issues because we are
416 # using the &class_precedence_list
417 my (%seen_class, %seen_attr);
418 foreach my $class ($self->class_precedence_list()) {
419 next if $seen_class{$class};
420 $seen_class{$class}++;
421 # fetch the meta-class ...
422 my $meta = $self->initialize($class);
423 foreach my $attr_name ($meta->get_attribute_list()) {
424 next if exists $seen_attr{$attr_name};
425 $seen_attr{$attr_name}++;
c9e77dbb 426 push @attrs => $meta->get_attribute($attr_name);
e16da3e6 427 }
428 }
429 return @attrs;
430}
2eb717d5 431
52e8a34c 432# Class attributes
433
434sub add_package_variable {
435 my ($self, $variable, $initial_value) = @_;
436 (defined $variable && $variable =~ /^[\$\@\%]/)
437 || confess "variable name does not have a sigil";
438
439 my ($sigil, $name) = ($variable =~ /^(.)(.*)$/);
440 if (defined $initial_value) {
441 no strict 'refs';
442 *{$self->name . '::' . $name} = $initial_value;
443 }
444 else {
445 eval $sigil . $self->name . '::' . $name;
446 confess "Could not create package variable ($variable) because : $@" if $@;
447 }
448}
449
450sub has_package_variable {
451 my ($self, $variable) = @_;
452 (defined $variable && $variable =~ /^[\$\@\%]/)
453 || confess "variable name does not have a sigil";
454 my ($sigil, $name) = ($variable =~ /^(.)(.*)$/);
455 no strict 'refs';
456 defined ${$self->name . '::'}{$name} ? 1 : 0;
457}
458
459sub get_package_variable {
460 my ($self, $variable) = @_;
461 (defined $variable && $variable =~ /^[\$\@\%]/)
462 || confess "variable name does not have a sigil";
463 my ($sigil, $name) = ($variable =~ /^(.)(.*)$/);
464 no strict 'refs';
465 # try to fetch it first,.. see what happens
18697ac8 466 my $ref = eval '\\' . $sigil . $self->name . '::' . $name;
52e8a34c 467 confess "Could not get the package variable ($variable) because : $@" if $@;
468 # if we didn't die, then we can return it
18697ac8 469 return $ref;
52e8a34c 470}
471
472sub remove_package_variable {
473 my ($self, $variable) = @_;
474 (defined $variable && $variable =~ /^[\$\@\%]/)
475 || confess "variable name does not have a sigil";
476 my ($sigil, $name) = ($variable =~ /^(.)(.*)$/);
477 no strict 'refs';
478 delete ${$self->name . '::'}{$name};
479}
480
8b978dd5 4811;
482
483__END__
484
485=pod
486
487=head1 NAME
488
489Class::MOP::Class - Class Meta Object
490
491=head1 SYNOPSIS
492
fe122940 493 # use this for introspection ...
494
fe122940 495 # add a method to Foo ...
496 Foo->meta->add_method('bar' => sub { ... })
497
498 # get a list of all the classes searched
499 # the method dispatcher in the correct order
500 Foo->meta->class_precedence_list()
501
502 # remove a method from Foo
503 Foo->meta->remove_method('bar');
504
505 # or use this to actually create classes ...
506
507 Class::MOP::Class->create('Bar' => '0.01' => (
508 superclasses => [ 'Foo' ],
509 attributes => [
510 Class::MOP:::Attribute->new('$bar'),
511 Class::MOP:::Attribute->new('$baz'),
512 ],
513 methods => {
514 calculate_bar => sub { ... },
515 construct_baz => sub { ... }
516 }
517 ));
518
8b978dd5 519=head1 DESCRIPTION
520
fe122940 521This is the largest and currently most complex part of the Perl 5
522meta-object protocol. It controls the introspection and
523manipulation of Perl 5 classes (and it can create them too). The
524best way to understand what this module can do, is to read the
525documentation for each of it's methods.
526
552e3d24 527=head1 METHODS
528
2eb717d5 529=head2 Self Introspection
530
531=over 4
532
533=item B<meta>
534
fe122940 535This will return a B<Class::MOP::Class> instance which is related
536to this class. Thereby allowing B<Class::MOP::Class> to actually
537introspect itself.
538
539As with B<Class::MOP::Attribute>, B<Class::MOP> will actually
540bootstrap this module by installing a number of attribute meta-objects
541into it's metaclass. This will allow this class to reap all the benifits
542of the MOP when subclassing it.
2eb717d5 543
544=back
545
552e3d24 546=head2 Class construction
547
a2e85e6c 548These methods will handle creating B<Class::MOP::Class> objects,
549which can be used to both create new classes, and analyze
550pre-existing classes.
552e3d24 551
552This module will internally store references to all the instances
553you create with these methods, so that they do not need to be
554created any more than nessecary. Basically, they are singletons.
555
556=over 4
557
558=item B<create ($package_name, ?$package_version,
a2e85e6c 559 superclasses =E<gt> ?@superclasses,
560 methods =E<gt> ?%methods,
561 attributes =E<gt> ?%attributes)>
552e3d24 562
a2e85e6c 563This returns a B<Class::MOP::Class> object, bringing the specified
552e3d24 564C<$package_name> into existence and adding any of the
565C<$package_version>, C<@superclasses>, C<%methods> and C<%attributes>
566to it.
567
568=item B<initialize ($package_name)>
569
a2e85e6c 570This initializes and returns returns a B<Class::MOP::Class> object
571for a given a C<$package_name>.
572
651955fb 573=item B<construct_class_instance (%options)>
a2e85e6c 574
575This will construct an instance of B<Class::MOP::Class>, it is
576here so that we can actually "tie the knot" for B<Class::MOP::Class>
577to use C<construct_instance> once all the bootstrapping is done. This
578method is used internally by C<initialize> and should never be called
579from outside of that method really.
552e3d24 580
550d56db 581=item B<check_metaclass_compatability>
582
583This method is called as the very last thing in the
584C<construct_class_instance> method. This will check that the
585metaclass you are creating is compatible with the metaclasses of all
586your ancestors. For more inforamtion about metaclass compatibility
587see the C<About Metaclass compatibility> section in L<Class::MOP>.
588
552e3d24 589=back
590
c9e77dbb 591=head2 Object instance construction and cloning
a2e85e6c 592
c9e77dbb 593These methods are B<entirely optional>, it is up to you whether you want
594to use them or not.
552e3d24 595
596=over 4
597
5f3c057a 598=item B<new_object (%params)>
599
600This is a convience method for creating a new object of the class, and
601blessing it into the appropriate package as well. Ideally your class
602would call a C<new> this method like so:
603
604 sub MyClass::new {
605 my ($class, %param) = @_;
606 $class->meta->new_object(%params);
607 }
608
609Of course the ideal place for this would actually be in C<UNIVERSAL::>
610but that is considered bad style, so we do not do that.
611
cbd9f942 612=item B<construct_instance (%params)>
552e3d24 613
c9e77dbb 614This method is used to construct an instace structure suitable for
615C<bless>-ing into your package of choice. It works in conjunction
616with the Attribute protocol to collect all applicable attributes.
617
cbd9f942 618This will construct and instance using a HASH ref as storage
552e3d24 619(currently only HASH references are supported). This will collect all
a2e85e6c 620the applicable attributes and layout out the fields in the HASH ref,
621it will then initialize them using either use the corresponding key
622in C<%params> or any default value or initializer found in the
623attribute meta-object.
727919c5 624
5f3c057a 625=item B<clone_object ($instance, %params)>
626
627This is a convience method for cloning an object instance, then
19d4b5b8 628blessing it into the appropriate package. This method will call
629C<clone_instance>, which performs a shallow copy of the object,
630see that methods documentation for more details. Ideally your
631class would call a C<clone> this method like so:
5f3c057a 632
633 sub MyClass::clone {
634 my ($self, %param) = @_;
635 $self->meta->clone_object($self, %params);
636 }
637
638Of course the ideal place for this would actually be in C<UNIVERSAL::>
639but that is considered bad style, so we do not do that.
640
c9e77dbb 641=item B<clone_instance($instance, %params)>
642
643This method is a compliment of C<construct_instance> (which means if
19d4b5b8 644you override C<construct_instance>, you need to override this one too),
645and clones the instance shallowly.
a27ae83f 646
647The cloned structure returned is (like with C<construct_instance>) an
648unC<bless>ed HASH reference, it is your responsibility to then bless
649this cloned structure into the right class (which C<clone_object> will
650do for you).
c9e77dbb 651
19d4b5b8 652As of 0.11, this method will clone the C<$instance> structure shallowly,
653as opposed to the deep cloning implemented in prior versions. After much
654thought, research and discussion, I have decided that anything but basic
655shallow cloning is outside the scope of the meta-object protocol. I
656think Yuval "nothingmuch" Kogman put it best when he said that cloning
657is too I<context-specific> to be part of the MOP.
658
552e3d24 659=back
660
661=head2 Informational
662
663=over 4
664
665=item B<name>
666
a2e85e6c 667This is a read-only attribute which returns the package name for the
668given B<Class::MOP::Class> instance.
552e3d24 669
670=item B<version>
671
672This is a read-only attribute which returns the C<$VERSION> of the
a2e85e6c 673package for the given B<Class::MOP::Class> instance.
552e3d24 674
675=back
676
677=head2 Inheritance Relationships
678
679=over 4
680
681=item B<superclasses (?@superclasses)>
682
683This is a read-write attribute which represents the superclass
a2e85e6c 684relationships of the class the B<Class::MOP::Class> instance is
685associated with. Basically, it can get and set the C<@ISA> for you.
552e3d24 686
343203ee 687B<NOTE:>
688Perl will occasionally perform some C<@ISA> and method caching, if
689you decide to change your superclass relationship at runtime (which
690is quite insane and very much not recommened), then you should be
691aware of this and the fact that this module does not make any
692attempt to address this issue.
693
552e3d24 694=item B<class_precedence_list>
695
a2e85e6c 696This computes the a list of all the class's ancestors in the same order
697in which method dispatch will be done. This is similair to
698what B<Class::ISA::super_path> does, but we don't remove duplicate names.
552e3d24 699
700=back
701
702=head2 Methods
703
704=over 4
705
2e41896e 706=item B<method_metaclass>
707
552e3d24 708=item B<add_method ($method_name, $method)>
709
710This will take a C<$method_name> and CODE reference to that
a2e85e6c 711C<$method> and install it into the class's package.
552e3d24 712
a2e85e6c 713B<NOTE>:
714This does absolutely nothing special to C<$method>
552e3d24 715other than use B<Sub::Name> to make sure it is tagged with the
716correct name, and therefore show up correctly in stack traces and
717such.
718
663f8198 719=item B<alias_method ($method_name, $method)>
720
721This will take a C<$method_name> and CODE reference to that
722C<$method> and alias the method into the class's package.
723
724B<NOTE>:
725Unlike C<add_method>, this will B<not> try to name the
726C<$method> using B<Sub::Name>, it only aliases the method in
727the class's package.
728
552e3d24 729=item B<has_method ($method_name)>
730
a2e85e6c 731This just provides a simple way to check if the class implements
552e3d24 732a specific C<$method_name>. It will I<not> however, attempt to check
a2e85e6c 733if the class inherits the method (use C<UNIVERSAL::can> for that).
552e3d24 734
735This will correctly handle functions defined outside of the package
736that use a fully qualified name (C<sub Package::name { ... }>).
737
738This will correctly handle functions renamed with B<Sub::Name> and
739installed using the symbol tables. However, if you are naming the
740subroutine outside of the package scope, you must use the fully
741qualified name, including the package name, for C<has_method> to
742correctly identify it.
743
744This will attempt to correctly ignore functions imported from other
745packages using B<Exporter>. It breaks down if the function imported
746is an C<__ANON__> sub (such as with C<use constant>), which very well
747may be a valid method being applied to the class.
748
749In short, this method cannot always be trusted to determine if the
750C<$method_name> is actually a method. However, it will DWIM about
a2e85e6c 75190% of the time, so it's a small trade off I think.
552e3d24 752
753=item B<get_method ($method_name)>
754
755This will return a CODE reference of the specified C<$method_name>,
756or return undef if that method does not exist.
757
758=item B<remove_method ($method_name)>
759
a2e85e6c 760This will attempt to remove a given C<$method_name> from the class.
552e3d24 761It will return the CODE reference that it has removed, and will
762attempt to use B<Sub::Name> to clear the methods associated name.
763
764=item B<get_method_list>
765
766This will return a list of method names for all I<locally> defined
767methods. It does B<not> provide a list of all applicable methods,
768including any inherited ones. If you want a list of all applicable
769methods, use the C<compute_all_applicable_methods> method.
770
771=item B<compute_all_applicable_methods>
772
a2e85e6c 773This will return a list of all the methods names this class will
774respond to, taking into account inheritance. The list will be a list of
552e3d24 775HASH references, each one containing the following information; method
776name, the name of the class in which the method lives and a CODE
777reference for the actual method.
778
779=item B<find_all_methods_by_name ($method_name)>
780
781This will traverse the inheritence hierarchy and locate all methods
782with a given C<$method_name>. Similar to
783C<compute_all_applicable_methods> it returns a list of HASH references
784with the following information; method name (which will always be the
785same as C<$method_name>), the name of the class in which the method
786lives and a CODE reference for the actual method.
787
788The list of methods produced is a distinct list, meaning there are no
789duplicates in it. This is especially useful for things like object
790initialization and destruction where you only want the method called
791once, and in the correct order.
792
793=back
794
795=head2 Attributes
796
797It should be noted that since there is no one consistent way to define
798the attributes of a class in Perl 5. These methods can only work with
799the information given, and can not easily discover information on
a2e85e6c 800their own. See L<Class::MOP::Attribute> for more details.
552e3d24 801
802=over 4
803
2e41896e 804=item B<attribute_metaclass>
805
7b31baf4 806=item B<get_attribute_map>
807
552e3d24 808=item B<add_attribute ($attribute_name, $attribute_meta_object)>
809
a2e85e6c 810This stores a C<$attribute_meta_object> in the B<Class::MOP::Class>
811instance associated with the given class, and associates it with
812the C<$attribute_name>. Unlike methods, attributes within the MOP
813are stored as meta-information only. They will be used later to
814construct instances from (see C<construct_instance> above).
552e3d24 815More details about the attribute meta-objects can be found in the
a2e85e6c 816L<Class::MOP::Attribute> or the L<Class::MOP/The Attribute protocol>
817section.
818
819It should be noted that any accessor, reader/writer or predicate
820methods which the C<$attribute_meta_object> has will be installed
821into the class at this time.
552e3d24 822
823=item B<has_attribute ($attribute_name)>
824
a2e85e6c 825Checks to see if this class has an attribute by the name of
552e3d24 826C<$attribute_name> and returns a boolean.
827
828=item B<get_attribute ($attribute_name)>
829
830Returns the attribute meta-object associated with C<$attribute_name>,
831if none is found, it will return undef.
832
833=item B<remove_attribute ($attribute_name)>
834
835This will remove the attribute meta-object stored at
836C<$attribute_name>, then return the removed attribute meta-object.
837
a2e85e6c 838B<NOTE:>
839Removing an attribute will only affect future instances of
552e3d24 840the class, it will not make any attempt to remove the attribute from
841any existing instances of the class.
842
a2e85e6c 843It should be noted that any accessor, reader/writer or predicate
844methods which the attribute meta-object stored at C<$attribute_name>
845has will be removed from the class at this time. This B<will> make
846these attributes somewhat inaccessable in previously created
847instances. But if you are crazy enough to do this at runtime, then
848you are crazy enough to deal with something like this :).
849
552e3d24 850=item B<get_attribute_list>
851
852This returns a list of attribute names which are defined in the local
853class. If you want a list of all applicable attributes for a class,
854use the C<compute_all_applicable_attributes> method.
855
856=item B<compute_all_applicable_attributes>
857
c9e77dbb 858This will traverse the inheritance heirachy and return a list of all
859the applicable attributes for this class. It does not construct a
860HASH reference like C<compute_all_applicable_methods> because all
861that same information is discoverable through the attribute
862meta-object itself.
552e3d24 863
864=back
865
52e8a34c 866=head2 Package Variables
867
868Since Perl's classes are built atop the Perl package system, it is
869fairly common to use package scoped variables for things like static
870class variables. The following methods are convience methods for
871the creation and inspection of package scoped variables.
872
873=over 4
874
875=item B<add_package_variable ($variable_name, ?$initial_value)>
876
877Given a C<$variable_name>, which must contain a leading sigil, this
878method will create that variable within the package which houses the
879class. It also takes an optional C<$initial_value>, which must be a
880reference of the same type as the sigil of the C<$variable_name>
881implies.
882
883=item B<get_package_variable ($variable_name)>
884
885This will return a reference to the package variable in
886C<$variable_name>.
887
888=item B<has_package_variable ($variable_name)>
889
890Returns true (C<1>) if there is a package variable defined for
891C<$variable_name>, and false (C<0>) otherwise.
892
893=item B<remove_package_variable ($variable_name)>
894
895This will attempt to remove the package variable at C<$variable_name>.
896
897=back
898
8b978dd5 899=head1 AUTHOR
900
a2e85e6c 901Stevan Little E<lt>stevan@iinteractive.comE<gt>
8b978dd5 902
903=head1 COPYRIGHT AND LICENSE
904
905Copyright 2006 by Infinity Interactive, Inc.
906
907L<http://www.iinteractive.com>
908
909This library is free software; you can redistribute it and/or modify
910it under the same terms as Perl itself.
911
912=cut