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