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