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