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