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