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