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