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