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