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