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