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