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