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