optimized
[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
bb8dacfa 20#{
bfe4d0fc 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 }
bb8dacfa 100#}
8b978dd5 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 {
bb8dacfa 240 ($METAS{$_} || $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";
bb8dacfa 492 # OPTIMIZATION NOTE:
493 # we used to say `if $self->has_attribute($attribute_name)`
494 # here, but since get_attribute is called so often, we
495 # eliminate the function call here
496 return $self->{'%:attributes'}->{$attribute_name}
497 if exists $self->{'%:attributes'}->{$attribute_name};
22286063 498 return;
e16da3e6 499}
500
501sub remove_attribute {
502 my ($self, $attribute_name) = @_;
503 (defined $attribute_name && $attribute_name)
504 || confess "You must define an attribute name";
7b31baf4 505 my $removed_attribute = $self->get_attribute_map->{$attribute_name};
22286063 506 return unless defined $removed_attribute;
507 delete $self->get_attribute_map->{$attribute_name};
9ec169fe 508 $removed_attribute->remove_accessors();
509 $removed_attribute->detach_from_class();
e16da3e6 510 return $removed_attribute;
511}
512
513sub get_attribute_list {
514 my $self = shift;
bb8dacfa 515 # OPTIMIZATION NOTE:
516 # We don't use get_attribute_map here because
517 # we ask for the attribute list quite often
518 # in compute_all_applicable_attributes, so
519 # eliminating the function call helps
520 keys %{$self->{'%:attributes'}};
e16da3e6 521}
522
523sub compute_all_applicable_attributes {
524 my $self = shift;
525 my @attrs;
526 # keep a record of what we have seen
527 # here, this will handle all the
528 # inheritence issues because we are
529 # using the &class_precedence_list
530 my (%seen_class, %seen_attr);
531 foreach my $class ($self->class_precedence_list()) {
532 next if $seen_class{$class};
533 $seen_class{$class}++;
534 # fetch the meta-class ...
bb8dacfa 535 my $meta = ($METAS{$class} || $self->initialize($class));
e16da3e6 536 foreach my $attr_name ($meta->get_attribute_list()) {
537 next if exists $seen_attr{$attr_name};
538 $seen_attr{$attr_name}++;
c9e77dbb 539 push @attrs => $meta->get_attribute($attr_name);
e16da3e6 540 }
541 }
542 return @attrs;
543}
2eb717d5 544
058c1cf5 545sub find_attribute_by_name {
546 my ($self, $attr_name) = @_;
547 # keep a record of what we have seen
548 # here, this will handle all the
549 # inheritence issues because we are
550 # using the &class_precedence_list
551 my %seen_class;
552 foreach my $class ($self->class_precedence_list()) {
553 next if $seen_class{$class};
554 $seen_class{$class}++;
555 # fetch the meta-class ...
556 my $meta = $self->initialize($class);
557 return $meta->get_attribute($attr_name)
558 if $meta->has_attribute($attr_name);
559 }
560 return;
561}
562
52e8a34c 563# Class attributes
564
565sub add_package_variable {
566 my ($self, $variable, $initial_value) = @_;
567 (defined $variable && $variable =~ /^[\$\@\%]/)
568 || confess "variable name does not have a sigil";
569
570 my ($sigil, $name) = ($variable =~ /^(.)(.*)$/);
571 if (defined $initial_value) {
572 no strict 'refs';
573 *{$self->name . '::' . $name} = $initial_value;
574 }
575 else {
39ec4f0c 576 my $e;
577 {
578 # NOTE:
579 # We HAVE to localize $@ or all
580 # hell breaks loose. It is not
581 # good, believe me, not good.
582 local $@;
583 eval $sigil . $self->name . '::' . $name;
584 $e = $@ if $@;
585 }
586 confess "Could not create package variable ($variable) because : $e" if $e;
52e8a34c 587 }
588}
589
590sub has_package_variable {
591 my ($self, $variable) = @_;
592 (defined $variable && $variable =~ /^[\$\@\%]/)
593 || confess "variable name does not have a sigil";
594 my ($sigil, $name) = ($variable =~ /^(.)(.*)$/);
595 no strict 'refs';
596 defined ${$self->name . '::'}{$name} ? 1 : 0;
597}
598
599sub get_package_variable {
600 my ($self, $variable) = @_;
601 (defined $variable && $variable =~ /^[\$\@\%]/)
602 || confess "variable name does not have a sigil";
603 my ($sigil, $name) = ($variable =~ /^(.)(.*)$/);
39ec4f0c 604 my ($ref, $e);
605 {
606 # NOTE:
607 # We HAVE to localize $@ or all
608 # hell breaks loose. It is not
609 # good, believe me, not good.
610 local $@;
611 $ref = eval '\\' . $sigil . $self->name . '::' . $name;
612 $e = $@ if $@;
613 }
614 confess "Could not get the package variable ($variable) because : $e" if $e;
52e8a34c 615 # if we didn't die, then we can return it
18697ac8 616 return $ref;
52e8a34c 617}
618
619sub remove_package_variable {
620 my ($self, $variable) = @_;
621 (defined $variable && $variable =~ /^[\$\@\%]/)
622 || confess "variable name does not have a sigil";
623 my ($sigil, $name) = ($variable =~ /^(.)(.*)$/);
624 no strict 'refs';
625 delete ${$self->name . '::'}{$name};
626}
627
8b978dd5 6281;
629
630__END__
631
632=pod
633
634=head1 NAME
635
636Class::MOP::Class - Class Meta Object
637
638=head1 SYNOPSIS
639
8c936afc 640 # assuming that class Foo
641 # has been defined, you can
642
fe122940 643 # use this for introspection ...
644
fe122940 645 # add a method to Foo ...
646 Foo->meta->add_method('bar' => sub { ... })
647
648 # get a list of all the classes searched
649 # the method dispatcher in the correct order
650 Foo->meta->class_precedence_list()
651
652 # remove a method from Foo
653 Foo->meta->remove_method('bar');
654
655 # or use this to actually create classes ...
656
657 Class::MOP::Class->create('Bar' => '0.01' => (
658 superclasses => [ 'Foo' ],
659 attributes => [
660 Class::MOP:::Attribute->new('$bar'),
661 Class::MOP:::Attribute->new('$baz'),
662 ],
663 methods => {
664 calculate_bar => sub { ... },
665 construct_baz => sub { ... }
666 }
667 ));
668
8b978dd5 669=head1 DESCRIPTION
670
fe122940 671This is the largest and currently most complex part of the Perl 5
672meta-object protocol. It controls the introspection and
673manipulation of Perl 5 classes (and it can create them too). The
674best way to understand what this module can do, is to read the
675documentation for each of it's methods.
676
552e3d24 677=head1 METHODS
678
2eb717d5 679=head2 Self Introspection
680
681=over 4
682
683=item B<meta>
684
fe122940 685This will return a B<Class::MOP::Class> instance which is related
686to this class. Thereby allowing B<Class::MOP::Class> to actually
687introspect itself.
688
689As with B<Class::MOP::Attribute>, B<Class::MOP> will actually
690bootstrap this module by installing a number of attribute meta-objects
691into it's metaclass. This will allow this class to reap all the benifits
692of the MOP when subclassing it.
2eb717d5 693
587aca23 694=item B<get_all_metaclasses>
695
696This will return an hash of all the metaclass instances that have
697been cached by B<Class::MOP::Class> keyed by the package name.
698
699=item B<get_all_metaclass_instances>
700
701This will return an array of all the metaclass instances that have
702been cached by B<Class::MOP::Class>.
703
704=item B<get_all_metaclass_names>
705
706This will return an array of all the metaclass names that have
707been cached by B<Class::MOP::Class>.
708
2eb717d5 709=back
710
552e3d24 711=head2 Class construction
712
a2e85e6c 713These methods will handle creating B<Class::MOP::Class> objects,
714which can be used to both create new classes, and analyze
715pre-existing classes.
552e3d24 716
717This module will internally store references to all the instances
718you create with these methods, so that they do not need to be
719created any more than nessecary. Basically, they are singletons.
720
721=over 4
722
723=item B<create ($package_name, ?$package_version,
a2e85e6c 724 superclasses =E<gt> ?@superclasses,
725 methods =E<gt> ?%methods,
726 attributes =E<gt> ?%attributes)>
552e3d24 727
a2e85e6c 728This returns a B<Class::MOP::Class> object, bringing the specified
552e3d24 729C<$package_name> into existence and adding any of the
730C<$package_version>, C<@superclasses>, C<%methods> and C<%attributes>
731to it.
732
587aca23 733=item B<create_anon_class (superclasses =E<gt> ?@superclasses,
734 methods =E<gt> ?%methods,
735 attributes =E<gt> ?%attributes)>
736
737This will create an anonymous class, it works much like C<create> but
738it does not need a C<$package_name>. Instead it will create a suitably
739unique package name for you to stash things into.
740
552e3d24 741=item B<initialize ($package_name)>
742
a2e85e6c 743This initializes and returns returns a B<Class::MOP::Class> object
744for a given a C<$package_name>.
745
651955fb 746=item B<construct_class_instance (%options)>
a2e85e6c 747
748This will construct an instance of B<Class::MOP::Class>, it is
749here so that we can actually "tie the knot" for B<Class::MOP::Class>
750to use C<construct_instance> once all the bootstrapping is done. This
751method is used internally by C<initialize> and should never be called
752from outside of that method really.
552e3d24 753
550d56db 754=item B<check_metaclass_compatability>
755
756This method is called as the very last thing in the
757C<construct_class_instance> method. This will check that the
758metaclass you are creating is compatible with the metaclasses of all
759your ancestors. For more inforamtion about metaclass compatibility
760see the C<About Metaclass compatibility> section in L<Class::MOP>.
761
552e3d24 762=back
763
c9e77dbb 764=head2 Object instance construction and cloning
a2e85e6c 765
c9e77dbb 766These methods are B<entirely optional>, it is up to you whether you want
767to use them or not.
552e3d24 768
769=over 4
770
5f3c057a 771=item B<new_object (%params)>
772
773This is a convience method for creating a new object of the class, and
774blessing it into the appropriate package as well. Ideally your class
775would call a C<new> this method like so:
776
777 sub MyClass::new {
778 my ($class, %param) = @_;
779 $class->meta->new_object(%params);
780 }
781
782Of course the ideal place for this would actually be in C<UNIVERSAL::>
783but that is considered bad style, so we do not do that.
784
cbd9f942 785=item B<construct_instance (%params)>
552e3d24 786
c9e77dbb 787This method is used to construct an instace structure suitable for
788C<bless>-ing into your package of choice. It works in conjunction
789with the Attribute protocol to collect all applicable attributes.
790
cbd9f942 791This will construct and instance using a HASH ref as storage
552e3d24 792(currently only HASH references are supported). This will collect all
a2e85e6c 793the applicable attributes and layout out the fields in the HASH ref,
794it will then initialize them using either use the corresponding key
795in C<%params> or any default value or initializer found in the
796attribute meta-object.
727919c5 797
5f3c057a 798=item B<clone_object ($instance, %params)>
799
800This is a convience method for cloning an object instance, then
19d4b5b8 801blessing it into the appropriate package. This method will call
802C<clone_instance>, which performs a shallow copy of the object,
803see that methods documentation for more details. Ideally your
804class would call a C<clone> this method like so:
5f3c057a 805
806 sub MyClass::clone {
807 my ($self, %param) = @_;
808 $self->meta->clone_object($self, %params);
809 }
810
811Of course the ideal place for this would actually be in C<UNIVERSAL::>
812but that is considered bad style, so we do not do that.
813
c9e77dbb 814=item B<clone_instance($instance, %params)>
815
816This method is a compliment of C<construct_instance> (which means if
19d4b5b8 817you override C<construct_instance>, you need to override this one too),
818and clones the instance shallowly.
a27ae83f 819
820The cloned structure returned is (like with C<construct_instance>) an
821unC<bless>ed HASH reference, it is your responsibility to then bless
822this cloned structure into the right class (which C<clone_object> will
823do for you).
c9e77dbb 824
19d4b5b8 825As of 0.11, this method will clone the C<$instance> structure shallowly,
826as opposed to the deep cloning implemented in prior versions. After much
827thought, research and discussion, I have decided that anything but basic
828shallow cloning is outside the scope of the meta-object protocol. I
829think Yuval "nothingmuch" Kogman put it best when he said that cloning
830is too I<context-specific> to be part of the MOP.
831
552e3d24 832=back
833
834=head2 Informational
835
836=over 4
837
838=item B<name>
839
a2e85e6c 840This is a read-only attribute which returns the package name for the
841given B<Class::MOP::Class> instance.
552e3d24 842
843=item B<version>
844
845This is a read-only attribute which returns the C<$VERSION> of the
a2e85e6c 846package for the given B<Class::MOP::Class> instance.
552e3d24 847
848=back
849
850=head2 Inheritance Relationships
851
852=over 4
853
854=item B<superclasses (?@superclasses)>
855
856This is a read-write attribute which represents the superclass
a2e85e6c 857relationships of the class the B<Class::MOP::Class> instance is
858associated with. Basically, it can get and set the C<@ISA> for you.
552e3d24 859
343203ee 860B<NOTE:>
861Perl will occasionally perform some C<@ISA> and method caching, if
862you decide to change your superclass relationship at runtime (which
863is quite insane and very much not recommened), then you should be
864aware of this and the fact that this module does not make any
865attempt to address this issue.
866
552e3d24 867=item B<class_precedence_list>
868
a2e85e6c 869This computes the a list of all the class's ancestors in the same order
870in which method dispatch will be done. This is similair to
871what B<Class::ISA::super_path> does, but we don't remove duplicate names.
552e3d24 872
873=back
874
875=head2 Methods
876
877=over 4
878
2e41896e 879=item B<method_metaclass>
880
552e3d24 881=item B<add_method ($method_name, $method)>
882
883This will take a C<$method_name> and CODE reference to that
a2e85e6c 884C<$method> and install it into the class's package.
552e3d24 885
a2e85e6c 886B<NOTE>:
887This does absolutely nothing special to C<$method>
552e3d24 888other than use B<Sub::Name> to make sure it is tagged with the
889correct name, and therefore show up correctly in stack traces and
890such.
891
663f8198 892=item B<alias_method ($method_name, $method)>
893
894This will take a C<$method_name> and CODE reference to that
895C<$method> and alias the method into the class's package.
896
897B<NOTE>:
898Unlike C<add_method>, this will B<not> try to name the
899C<$method> using B<Sub::Name>, it only aliases the method in
900the class's package.
901
552e3d24 902=item B<has_method ($method_name)>
903
a2e85e6c 904This just provides a simple way to check if the class implements
552e3d24 905a specific C<$method_name>. It will I<not> however, attempt to check
a2e85e6c 906if the class inherits the method (use C<UNIVERSAL::can> for that).
552e3d24 907
908This will correctly handle functions defined outside of the package
909that use a fully qualified name (C<sub Package::name { ... }>).
910
911This will correctly handle functions renamed with B<Sub::Name> and
912installed using the symbol tables. However, if you are naming the
913subroutine outside of the package scope, you must use the fully
914qualified name, including the package name, for C<has_method> to
915correctly identify it.
916
917This will attempt to correctly ignore functions imported from other
918packages using B<Exporter>. It breaks down if the function imported
919is an C<__ANON__> sub (such as with C<use constant>), which very well
920may be a valid method being applied to the class.
921
922In short, this method cannot always be trusted to determine if the
923C<$method_name> is actually a method. However, it will DWIM about
a2e85e6c 92490% of the time, so it's a small trade off I think.
552e3d24 925
926=item B<get_method ($method_name)>
927
928This will return a CODE reference of the specified C<$method_name>,
929or return undef if that method does not exist.
930
931=item B<remove_method ($method_name)>
932
a2e85e6c 933This will attempt to remove a given C<$method_name> from the class.
552e3d24 934It will return the CODE reference that it has removed, and will
935attempt to use B<Sub::Name> to clear the methods associated name.
936
937=item B<get_method_list>
938
939This will return a list of method names for all I<locally> defined
940methods. It does B<not> provide a list of all applicable methods,
941including any inherited ones. If you want a list of all applicable
942methods, use the C<compute_all_applicable_methods> method.
943
944=item B<compute_all_applicable_methods>
945
a2e85e6c 946This will return a list of all the methods names this class will
947respond to, taking into account inheritance. The list will be a list of
552e3d24 948HASH references, each one containing the following information; method
949name, the name of the class in which the method lives and a CODE
950reference for the actual method.
951
952=item B<find_all_methods_by_name ($method_name)>
953
954This will traverse the inheritence hierarchy and locate all methods
955with a given C<$method_name>. Similar to
956C<compute_all_applicable_methods> it returns a list of HASH references
957with the following information; method name (which will always be the
958same as C<$method_name>), the name of the class in which the method
959lives and a CODE reference for the actual method.
960
961The list of methods produced is a distinct list, meaning there are no
962duplicates in it. This is especially useful for things like object
963initialization and destruction where you only want the method called
964once, and in the correct order.
965
96ceced8 966=item B<find_next_method_by_name ($method_name)>
967
968This will return the first method to match a given C<$method_name> in
969the superclasses, this is basically equivalent to calling
970C<SUPER::$method_name>, but it can be dispatched at runtime.
971
552e3d24 972=back
973
a4258ffd 974=head2 Method Modifiers
975
96ceced8 976Method modifiers are a concept borrowed from CLOS, in which a method
977can be wrapped with I<before>, I<after> and I<around> method modifiers
978that will be called everytime the method is called.
979
980=head3 How method modifiers work?
981
982Method modifiers work by wrapping the original method and then replacing
983it in the classes symbol table. The wrappers will handle calling all the
984modifiers in the appropariate orders and preserving the calling context
985for the original method.
986
987Each method modifier serves a particular purpose, which may not be
988obvious to users of other method wrapping modules. To start with, the
989return values of I<before> and I<after> modifiers are ignored. This is
990because thier purpose is B<not> to filter the input and output of the
991primary method (this is done with an I<around> modifier). This may seem
992like an odd restriction to some, but doing this allows for simple code
993to be added at the begining or end of a method call without jeapordizing
994the normal functioning of the primary method or placing any extra
995responsibility on the code of the modifier. Of course if you have more
996complex needs, then use the I<around> modifier, which uses a variation
997of continutation passing style to allow for a high degree of flexibility.
998
999Before and around modifiers are called in last-defined-first-called order,
1000while after modifiers are called in first-defined-first-called order. So
1001the call tree might looks something like this:
1002
1003 before 2
1004 before 1
1005 around 2
1006 around 1
1007 primary
1008 after 1
1009 after 2
1010
1011To see examples of using method modifiers, see the following examples
1012included in the distribution; F<InstanceCountingClass>, F<Perl6Attribute>,
1013F<AttributesWithHistory> and F<C3MethodDispatchOrder>. There is also a
1014classic CLOS usage example in the test F<017_add_method_modifier.t>.
1015
1016=head3 What is the performance impact?
1017
1018Of course there is a performance cost associated with method modifiers,
1019but we have made every effort to make that cost be directly proportional
1020to the amount of modifier features you utilize.
1021
1022The wrapping method does it's best to B<only> do as much work as it
1023absolutely needs to. In order to do this we have moved some of the
1024performance costs to set-up time, where they are easier to amortize.
1025
1026All this said, my benchmarks have indicated the following:
1027
1028 simple wrapper with no modifiers 100% slower
1029 simple wrapper with simple before modifier 400% slower
1030 simple wrapper with simple after modifier 450% slower
1031 simple wrapper with simple around modifier 500-550% slower
1032 simple wrapper with all 3 modifiers 1100% slower
1033
1034These numbers may seem daunting, but you must remember, every feature
1035comes with some cost. To put things in perspective, just doing a simple
1036C<AUTOLOAD> which does nothing but extract the name of the method called
1037and return it costs about 400% over a normal method call.
1038
a4258ffd 1039=over 4
1040
1041=item B<add_before_method_modifier ($method_name, $code)>
1042
96ceced8 1043This will wrap the method at C<$method_name> and the supplied C<$code>
1044will be passed the C<@_> arguments, and called before the original
1045method is called. As specified above, the return value of the I<before>
1046method modifiers is ignored, and it's ability to modify C<@_> is
1047fairly limited. If you need to do either of these things, use an
1048C<around> method modifier.
1049
a4258ffd 1050=item B<add_after_method_modifier ($method_name, $code)>
1051
96ceced8 1052This will wrap the method at C<$method_name> so that the original
1053method will be called, it's return values stashed, and then the
1054supplied C<$code> will be passed the C<@_> arguments, and called.
1055As specified above, the return value of the I<after> method
1056modifiers is ignored, and it cannot modify the return values of
1057the original method. If you need to do either of these things, use an
1058C<around> method modifier.
1059
a4258ffd 1060=item B<add_around_method_modifier ($method_name, $code)>
1061
96ceced8 1062This will wrap the method at C<$method_name> so that C<$code>
1063will be called and passed the original method as an extra argument
1064at the begining of the C<@_> argument list. This is a variation of
1065continuation passing style, where the function prepended to C<@_>
1066can be considered a continuation. It is up to C<$code> if it calls
1067the original method or not, there is no restriction on what the
1068C<$code> can or cannot do.
1069
a4258ffd 1070=back
1071
552e3d24 1072=head2 Attributes
1073
1074It should be noted that since there is no one consistent way to define
1075the attributes of a class in Perl 5. These methods can only work with
1076the information given, and can not easily discover information on
a2e85e6c 1077their own. See L<Class::MOP::Attribute> for more details.
552e3d24 1078
1079=over 4
1080
2e41896e 1081=item B<attribute_metaclass>
1082
7b31baf4 1083=item B<get_attribute_map>
1084
552e3d24 1085=item B<add_attribute ($attribute_name, $attribute_meta_object)>
1086
a2e85e6c 1087This stores a C<$attribute_meta_object> in the B<Class::MOP::Class>
1088instance associated with the given class, and associates it with
1089the C<$attribute_name>. Unlike methods, attributes within the MOP
1090are stored as meta-information only. They will be used later to
1091construct instances from (see C<construct_instance> above).
552e3d24 1092More details about the attribute meta-objects can be found in the
a2e85e6c 1093L<Class::MOP::Attribute> or the L<Class::MOP/The Attribute protocol>
1094section.
1095
1096It should be noted that any accessor, reader/writer or predicate
1097methods which the C<$attribute_meta_object> has will be installed
1098into the class at this time.
552e3d24 1099
1100=item B<has_attribute ($attribute_name)>
1101
a2e85e6c 1102Checks to see if this class has an attribute by the name of
552e3d24 1103C<$attribute_name> and returns a boolean.
1104
1105=item B<get_attribute ($attribute_name)>
1106
1107Returns the attribute meta-object associated with C<$attribute_name>,
1108if none is found, it will return undef.
1109
1110=item B<remove_attribute ($attribute_name)>
1111
1112This will remove the attribute meta-object stored at
1113C<$attribute_name>, then return the removed attribute meta-object.
1114
a2e85e6c 1115B<NOTE:>
1116Removing an attribute will only affect future instances of
552e3d24 1117the class, it will not make any attempt to remove the attribute from
1118any existing instances of the class.
1119
a2e85e6c 1120It should be noted that any accessor, reader/writer or predicate
1121methods which the attribute meta-object stored at C<$attribute_name>
1122has will be removed from the class at this time. This B<will> make
1123these attributes somewhat inaccessable in previously created
1124instances. But if you are crazy enough to do this at runtime, then
1125you are crazy enough to deal with something like this :).
1126
552e3d24 1127=item B<get_attribute_list>
1128
1129This returns a list of attribute names which are defined in the local
1130class. If you want a list of all applicable attributes for a class,
1131use the C<compute_all_applicable_attributes> method.
1132
1133=item B<compute_all_applicable_attributes>
1134
c9e77dbb 1135This will traverse the inheritance heirachy and return a list of all
1136the applicable attributes for this class. It does not construct a
1137HASH reference like C<compute_all_applicable_methods> because all
1138that same information is discoverable through the attribute
1139meta-object itself.
552e3d24 1140
058c1cf5 1141=item B<find_attribute_by_name ($attr_name)>
1142
1143This method will traverse the inheritance heirachy and find the
1144first attribute whose name matches C<$attr_name>, then return it.
1145It will return undef if nothing is found.
1146
552e3d24 1147=back
1148
52e8a34c 1149=head2 Package Variables
1150
1151Since Perl's classes are built atop the Perl package system, it is
1152fairly common to use package scoped variables for things like static
1153class variables. The following methods are convience methods for
1154the creation and inspection of package scoped variables.
1155
1156=over 4
1157
1158=item B<add_package_variable ($variable_name, ?$initial_value)>
1159
1160Given a C<$variable_name>, which must contain a leading sigil, this
1161method will create that variable within the package which houses the
1162class. It also takes an optional C<$initial_value>, which must be a
1163reference of the same type as the sigil of the C<$variable_name>
1164implies.
1165
1166=item B<get_package_variable ($variable_name)>
1167
1168This will return a reference to the package variable in
1169C<$variable_name>.
1170
1171=item B<has_package_variable ($variable_name)>
1172
1173Returns true (C<1>) if there is a package variable defined for
1174C<$variable_name>, and false (C<0>) otherwise.
1175
1176=item B<remove_package_variable ($variable_name)>
1177
1178This will attempt to remove the package variable at C<$variable_name>.
1179
1180=back
1181
8b978dd5 1182=head1 AUTHOR
1183
a2e85e6c 1184Stevan Little E<lt>stevan@iinteractive.comE<gt>
8b978dd5 1185
1186=head1 COPYRIGHT AND LICENSE
1187
1188Copyright 2006 by Infinity Interactive, Inc.
1189
1190L<http://www.iinteractive.com>
1191
1192This library is free software; you can redistribute it and/or modify
1193it under the same terms as Perl itself.
1194
1195=cut