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