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