Class::MOP::Class::Immutable
[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
df7b4119 12our $VERSION = '0.15';
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',
857f87a7 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 {
df7b4119 176 $class->initialize(blessed($_[0]) || $_[0]);
aa448b16 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);
11977e43 262 foreach my $key (keys %params) {
f7259199 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
857f87a7 691## Class closing
692
693sub is_mutable { 1 }
694sub is_immutable { 0 }
695
696sub make_immutable {
697 my ($class) = @_;
698 return Class::MOP::Class::Immutable->make_metaclass_immutable($class);
699}
700
8b978dd5 7011;
702
703__END__
704
705=pod
706
707=head1 NAME
708
709Class::MOP::Class - Class Meta Object
710
711=head1 SYNOPSIS
712
8c936afc 713 # assuming that class Foo
714 # has been defined, you can
715
fe122940 716 # use this for introspection ...
717
fe122940 718 # add a method to Foo ...
719 Foo->meta->add_method('bar' => sub { ... })
720
721 # get a list of all the classes searched
722 # the method dispatcher in the correct order
723 Foo->meta->class_precedence_list()
724
725 # remove a method from Foo
726 Foo->meta->remove_method('bar');
727
728 # or use this to actually create classes ...
729
730 Class::MOP::Class->create('Bar' => '0.01' => (
731 superclasses => [ 'Foo' ],
732 attributes => [
733 Class::MOP:::Attribute->new('$bar'),
734 Class::MOP:::Attribute->new('$baz'),
735 ],
736 methods => {
737 calculate_bar => sub { ... },
738 construct_baz => sub { ... }
739 }
740 ));
741
8b978dd5 742=head1 DESCRIPTION
743
fe122940 744This is the largest and currently most complex part of the Perl 5
745meta-object protocol. It controls the introspection and
746manipulation of Perl 5 classes (and it can create them too). The
747best way to understand what this module can do, is to read the
748documentation for each of it's methods.
749
552e3d24 750=head1 METHODS
751
2eb717d5 752=head2 Self Introspection
753
754=over 4
755
756=item B<meta>
757
fe122940 758This will return a B<Class::MOP::Class> instance which is related
759to this class. Thereby allowing B<Class::MOP::Class> to actually
760introspect itself.
761
762As with B<Class::MOP::Attribute>, B<Class::MOP> will actually
763bootstrap this module by installing a number of attribute meta-objects
764into it's metaclass. This will allow this class to reap all the benifits
765of the MOP when subclassing it.
2eb717d5 766
587aca23 767=item B<get_all_metaclasses>
768
769This will return an hash of all the metaclass instances that have
770been cached by B<Class::MOP::Class> keyed by the package name.
771
772=item B<get_all_metaclass_instances>
773
774This will return an array of all the metaclass instances that have
775been cached by B<Class::MOP::Class>.
776
777=item B<get_all_metaclass_names>
778
779This will return an array of all the metaclass names that have
780been cached by B<Class::MOP::Class>.
781
2eb717d5 782=back
783
552e3d24 784=head2 Class construction
785
a2e85e6c 786These methods will handle creating B<Class::MOP::Class> objects,
787which can be used to both create new classes, and analyze
788pre-existing classes.
552e3d24 789
790This module will internally store references to all the instances
791you create with these methods, so that they do not need to be
792created any more than nessecary. Basically, they are singletons.
793
794=over 4
795
796=item B<create ($package_name, ?$package_version,
a2e85e6c 797 superclasses =E<gt> ?@superclasses,
798 methods =E<gt> ?%methods,
799 attributes =E<gt> ?%attributes)>
552e3d24 800
a2e85e6c 801This returns a B<Class::MOP::Class> object, bringing the specified
552e3d24 802C<$package_name> into existence and adding any of the
803C<$package_version>, C<@superclasses>, C<%methods> and C<%attributes>
804to it.
805
587aca23 806=item B<create_anon_class (superclasses =E<gt> ?@superclasses,
807 methods =E<gt> ?%methods,
808 attributes =E<gt> ?%attributes)>
809
810This will create an anonymous class, it works much like C<create> but
811it does not need a C<$package_name>. Instead it will create a suitably
812unique package name for you to stash things into.
813
66b3dded 814=item B<initialize ($package_name, %options)>
552e3d24 815
a2e85e6c 816This initializes and returns returns a B<Class::MOP::Class> object
817for a given a C<$package_name>.
818
66b3dded 819=item B<reinitialize ($package_name, %options)>
820
821This removes the old metaclass, and creates a new one in it's place.
822Do B<not> use this unless you really know what you are doing, it could
823very easily make a very large mess of your program.
824
651955fb 825=item B<construct_class_instance (%options)>
a2e85e6c 826
827This will construct an instance of B<Class::MOP::Class>, it is
828here so that we can actually "tie the knot" for B<Class::MOP::Class>
829to use C<construct_instance> once all the bootstrapping is done. This
830method is used internally by C<initialize> and should never be called
831from outside of that method really.
552e3d24 832
550d56db 833=item B<check_metaclass_compatability>
834
835This method is called as the very last thing in the
836C<construct_class_instance> method. This will check that the
837metaclass you are creating is compatible with the metaclasses of all
838your ancestors. For more inforamtion about metaclass compatibility
839see the C<About Metaclass compatibility> section in L<Class::MOP>.
840
552e3d24 841=back
842
c9e77dbb 843=head2 Object instance construction and cloning
a2e85e6c 844
c9e77dbb 845These methods are B<entirely optional>, it is up to you whether you want
846to use them or not.
552e3d24 847
848=over 4
849
2bab2be6 850=item B<instance_metaclass>
851
2d711cc8 852=item B<get_meta_instance>
853
5f3c057a 854=item B<new_object (%params)>
855
856This is a convience method for creating a new object of the class, and
857blessing it into the appropriate package as well. Ideally your class
858would call a C<new> this method like so:
859
860 sub MyClass::new {
861 my ($class, %param) = @_;
862 $class->meta->new_object(%params);
863 }
864
865Of course the ideal place for this would actually be in C<UNIVERSAL::>
866but that is considered bad style, so we do not do that.
867
cbd9f942 868=item B<construct_instance (%params)>
552e3d24 869
c9e77dbb 870This method is used to construct an instace structure suitable for
871C<bless>-ing into your package of choice. It works in conjunction
872with the Attribute protocol to collect all applicable attributes.
873
cbd9f942 874This will construct and instance using a HASH ref as storage
552e3d24 875(currently only HASH references are supported). This will collect all
a2e85e6c 876the applicable attributes and layout out the fields in the HASH ref,
877it will then initialize them using either use the corresponding key
878in C<%params> or any default value or initializer found in the
879attribute meta-object.
727919c5 880
5f3c057a 881=item B<clone_object ($instance, %params)>
882
883This is a convience method for cloning an object instance, then
19d4b5b8 884blessing it into the appropriate package. This method will call
885C<clone_instance>, which performs a shallow copy of the object,
886see that methods documentation for more details. Ideally your
887class would call a C<clone> this method like so:
5f3c057a 888
889 sub MyClass::clone {
890 my ($self, %param) = @_;
891 $self->meta->clone_object($self, %params);
892 }
893
894Of course the ideal place for this would actually be in C<UNIVERSAL::>
895but that is considered bad style, so we do not do that.
896
c9e77dbb 897=item B<clone_instance($instance, %params)>
898
899This method is a compliment of C<construct_instance> (which means if
19d4b5b8 900you override C<construct_instance>, you need to override this one too),
901and clones the instance shallowly.
a27ae83f 902
903The cloned structure returned is (like with C<construct_instance>) an
904unC<bless>ed HASH reference, it is your responsibility to then bless
905this cloned structure into the right class (which C<clone_object> will
906do for you).
c9e77dbb 907
19d4b5b8 908As of 0.11, this method will clone the C<$instance> structure shallowly,
909as opposed to the deep cloning implemented in prior versions. After much
910thought, research and discussion, I have decided that anything but basic
911shallow cloning is outside the scope of the meta-object protocol. I
912think Yuval "nothingmuch" Kogman put it best when he said that cloning
913is too I<context-specific> to be part of the MOP.
914
552e3d24 915=back
916
917=head2 Informational
918
919=over 4
920
921=item B<name>
922
a2e85e6c 923This is a read-only attribute which returns the package name for the
924given B<Class::MOP::Class> instance.
552e3d24 925
926=item B<version>
927
928This is a read-only attribute which returns the C<$VERSION> of the
a2e85e6c 929package for the given B<Class::MOP::Class> instance.
552e3d24 930
931=back
932
933=head2 Inheritance Relationships
934
935=over 4
936
937=item B<superclasses (?@superclasses)>
938
939This is a read-write attribute which represents the superclass
a2e85e6c 940relationships of the class the B<Class::MOP::Class> instance is
941associated with. Basically, it can get and set the C<@ISA> for you.
552e3d24 942
343203ee 943B<NOTE:>
944Perl will occasionally perform some C<@ISA> and method caching, if
945you decide to change your superclass relationship at runtime (which
946is quite insane and very much not recommened), then you should be
947aware of this and the fact that this module does not make any
948attempt to address this issue.
949
552e3d24 950=item B<class_precedence_list>
951
a2e85e6c 952This computes the a list of all the class's ancestors in the same order
953in which method dispatch will be done. This is similair to
954what B<Class::ISA::super_path> does, but we don't remove duplicate names.
552e3d24 955
956=back
957
958=head2 Methods
959
960=over 4
961
2e41896e 962=item B<method_metaclass>
963
552e3d24 964=item B<add_method ($method_name, $method)>
965
966This will take a C<$method_name> and CODE reference to that
a2e85e6c 967C<$method> and install it into the class's package.
552e3d24 968
a2e85e6c 969B<NOTE>:
970This does absolutely nothing special to C<$method>
552e3d24 971other than use B<Sub::Name> to make sure it is tagged with the
972correct name, and therefore show up correctly in stack traces and
973such.
974
663f8198 975=item B<alias_method ($method_name, $method)>
976
977This will take a C<$method_name> and CODE reference to that
978C<$method> and alias the method into the class's package.
979
980B<NOTE>:
981Unlike C<add_method>, this will B<not> try to name the
982C<$method> using B<Sub::Name>, it only aliases the method in
983the class's package.
984
552e3d24 985=item B<has_method ($method_name)>
986
a2e85e6c 987This just provides a simple way to check if the class implements
552e3d24 988a specific C<$method_name>. It will I<not> however, attempt to check
a2e85e6c 989if the class inherits the method (use C<UNIVERSAL::can> for that).
552e3d24 990
991This will correctly handle functions defined outside of the package
992that use a fully qualified name (C<sub Package::name { ... }>).
993
994This will correctly handle functions renamed with B<Sub::Name> and
995installed using the symbol tables. However, if you are naming the
996subroutine outside of the package scope, you must use the fully
997qualified name, including the package name, for C<has_method> to
998correctly identify it.
999
1000This will attempt to correctly ignore functions imported from other
1001packages using B<Exporter>. It breaks down if the function imported
1002is an C<__ANON__> sub (such as with C<use constant>), which very well
1003may be a valid method being applied to the class.
1004
1005In short, this method cannot always be trusted to determine if the
1006C<$method_name> is actually a method. However, it will DWIM about
a2e85e6c 100790% of the time, so it's a small trade off I think.
552e3d24 1008
1009=item B<get_method ($method_name)>
1010
1011This will return a CODE reference of the specified C<$method_name>,
1012or return undef if that method does not exist.
1013
1014=item B<remove_method ($method_name)>
1015
a2e85e6c 1016This will attempt to remove a given C<$method_name> from the class.
552e3d24 1017It will return the CODE reference that it has removed, and will
1018attempt to use B<Sub::Name> to clear the methods associated name.
1019
1020=item B<get_method_list>
1021
1022This will return a list of method names for all I<locally> defined
1023methods. It does B<not> provide a list of all applicable methods,
1024including any inherited ones. If you want a list of all applicable
1025methods, use the C<compute_all_applicable_methods> method.
1026
1027=item B<compute_all_applicable_methods>
1028
a2e85e6c 1029This will return a list of all the methods names this class will
1030respond to, taking into account inheritance. The list will be a list of
552e3d24 1031HASH references, each one containing the following information; method
1032name, the name of the class in which the method lives and a CODE
1033reference for the actual method.
1034
1035=item B<find_all_methods_by_name ($method_name)>
1036
1037This will traverse the inheritence hierarchy and locate all methods
1038with a given C<$method_name>. Similar to
1039C<compute_all_applicable_methods> it returns a list of HASH references
1040with the following information; method name (which will always be the
1041same as C<$method_name>), the name of the class in which the method
1042lives and a CODE reference for the actual method.
1043
1044The list of methods produced is a distinct list, meaning there are no
1045duplicates in it. This is especially useful for things like object
1046initialization and destruction where you only want the method called
1047once, and in the correct order.
1048
96ceced8 1049=item B<find_next_method_by_name ($method_name)>
1050
1051This will return the first method to match a given C<$method_name> in
1052the superclasses, this is basically equivalent to calling
1053C<SUPER::$method_name>, but it can be dispatched at runtime.
1054
552e3d24 1055=back
1056
a4258ffd 1057=head2 Method Modifiers
1058
96ceced8 1059Method modifiers are a concept borrowed from CLOS, in which a method
1060can be wrapped with I<before>, I<after> and I<around> method modifiers
1061that will be called everytime the method is called.
1062
1063=head3 How method modifiers work?
1064
1065Method modifiers work by wrapping the original method and then replacing
1066it in the classes symbol table. The wrappers will handle calling all the
1067modifiers in the appropariate orders and preserving the calling context
1068for the original method.
1069
1070Each method modifier serves a particular purpose, which may not be
1071obvious to users of other method wrapping modules. To start with, the
1072return values of I<before> and I<after> modifiers are ignored. This is
1073because thier purpose is B<not> to filter the input and output of the
1074primary method (this is done with an I<around> modifier). This may seem
1075like an odd restriction to some, but doing this allows for simple code
1076to be added at the begining or end of a method call without jeapordizing
1077the normal functioning of the primary method or placing any extra
1078responsibility on the code of the modifier. Of course if you have more
1079complex needs, then use the I<around> modifier, which uses a variation
1080of continutation passing style to allow for a high degree of flexibility.
1081
1082Before and around modifiers are called in last-defined-first-called order,
1083while after modifiers are called in first-defined-first-called order. So
1084the call tree might looks something like this:
1085
1086 before 2
1087 before 1
1088 around 2
1089 around 1
1090 primary
1091 after 1
1092 after 2
1093
1094To see examples of using method modifiers, see the following examples
1095included in the distribution; F<InstanceCountingClass>, F<Perl6Attribute>,
1096F<AttributesWithHistory> and F<C3MethodDispatchOrder>. There is also a
1097classic CLOS usage example in the test F<017_add_method_modifier.t>.
1098
1099=head3 What is the performance impact?
1100
1101Of course there is a performance cost associated with method modifiers,
1102but we have made every effort to make that cost be directly proportional
1103to the amount of modifier features you utilize.
1104
1105The wrapping method does it's best to B<only> do as much work as it
1106absolutely needs to. In order to do this we have moved some of the
1107performance costs to set-up time, where they are easier to amortize.
1108
1109All this said, my benchmarks have indicated the following:
1110
1111 simple wrapper with no modifiers 100% slower
1112 simple wrapper with simple before modifier 400% slower
1113 simple wrapper with simple after modifier 450% slower
1114 simple wrapper with simple around modifier 500-550% slower
1115 simple wrapper with all 3 modifiers 1100% slower
1116
1117These numbers may seem daunting, but you must remember, every feature
1118comes with some cost. To put things in perspective, just doing a simple
1119C<AUTOLOAD> which does nothing but extract the name of the method called
1120and return it costs about 400% over a normal method call.
1121
a4258ffd 1122=over 4
1123
1124=item B<add_before_method_modifier ($method_name, $code)>
1125
96ceced8 1126This will wrap the method at C<$method_name> and the supplied C<$code>
1127will be passed the C<@_> arguments, and called before the original
1128method is called. As specified above, the return value of the I<before>
1129method modifiers is ignored, and it's ability to modify C<@_> is
1130fairly limited. If you need to do either of these things, use an
1131C<around> method modifier.
1132
a4258ffd 1133=item B<add_after_method_modifier ($method_name, $code)>
1134
96ceced8 1135This will wrap the method at C<$method_name> so that the original
1136method will be called, it's return values stashed, and then the
1137supplied C<$code> will be passed the C<@_> arguments, and called.
1138As specified above, the return value of the I<after> method
1139modifiers is ignored, and it cannot modify the return values of
1140the original method. If you need to do either of these things, use an
1141C<around> method modifier.
1142
a4258ffd 1143=item B<add_around_method_modifier ($method_name, $code)>
1144
96ceced8 1145This will wrap the method at C<$method_name> so that C<$code>
1146will be called and passed the original method as an extra argument
1147at the begining of the C<@_> argument list. This is a variation of
1148continuation passing style, where the function prepended to C<@_>
1149can be considered a continuation. It is up to C<$code> if it calls
1150the original method or not, there is no restriction on what the
1151C<$code> can or cannot do.
1152
a4258ffd 1153=back
1154
552e3d24 1155=head2 Attributes
1156
1157It should be noted that since there is no one consistent way to define
1158the attributes of a class in Perl 5. These methods can only work with
1159the information given, and can not easily discover information on
a2e85e6c 1160their own. See L<Class::MOP::Attribute> for more details.
552e3d24 1161
1162=over 4
1163
2e41896e 1164=item B<attribute_metaclass>
1165
7b31baf4 1166=item B<get_attribute_map>
1167
552e3d24 1168=item B<add_attribute ($attribute_name, $attribute_meta_object)>
1169
a2e85e6c 1170This stores a C<$attribute_meta_object> in the B<Class::MOP::Class>
1171instance associated with the given class, and associates it with
1172the C<$attribute_name>. Unlike methods, attributes within the MOP
1173are stored as meta-information only. They will be used later to
1174construct instances from (see C<construct_instance> above).
552e3d24 1175More details about the attribute meta-objects can be found in the
a2e85e6c 1176L<Class::MOP::Attribute> or the L<Class::MOP/The Attribute protocol>
1177section.
1178
1179It should be noted that any accessor, reader/writer or predicate
1180methods which the C<$attribute_meta_object> has will be installed
1181into the class at this time.
552e3d24 1182
1183=item B<has_attribute ($attribute_name)>
1184
a2e85e6c 1185Checks to see if this class has an attribute by the name of
552e3d24 1186C<$attribute_name> and returns a boolean.
1187
1188=item B<get_attribute ($attribute_name)>
1189
1190Returns the attribute meta-object associated with C<$attribute_name>,
1191if none is found, it will return undef.
1192
1193=item B<remove_attribute ($attribute_name)>
1194
1195This will remove the attribute meta-object stored at
1196C<$attribute_name>, then return the removed attribute meta-object.
1197
a2e85e6c 1198B<NOTE:>
1199Removing an attribute will only affect future instances of
552e3d24 1200the class, it will not make any attempt to remove the attribute from
1201any existing instances of the class.
1202
a2e85e6c 1203It should be noted that any accessor, reader/writer or predicate
1204methods which the attribute meta-object stored at C<$attribute_name>
1205has will be removed from the class at this time. This B<will> make
1206these attributes somewhat inaccessable in previously created
1207instances. But if you are crazy enough to do this at runtime, then
1208you are crazy enough to deal with something like this :).
1209
552e3d24 1210=item B<get_attribute_list>
1211
1212This returns a list of attribute names which are defined in the local
1213class. If you want a list of all applicable attributes for a class,
1214use the C<compute_all_applicable_attributes> method.
1215
1216=item B<compute_all_applicable_attributes>
1217
c9e77dbb 1218This will traverse the inheritance heirachy and return a list of all
1219the applicable attributes for this class. It does not construct a
1220HASH reference like C<compute_all_applicable_methods> because all
1221that same information is discoverable through the attribute
1222meta-object itself.
552e3d24 1223
058c1cf5 1224=item B<find_attribute_by_name ($attr_name)>
1225
1226This method will traverse the inheritance heirachy and find the
1227first attribute whose name matches C<$attr_name>, then return it.
1228It will return undef if nothing is found.
1229
552e3d24 1230=back
1231
52e8a34c 1232=head2 Package Variables
1233
1234Since Perl's classes are built atop the Perl package system, it is
1235fairly common to use package scoped variables for things like static
1236class variables. The following methods are convience methods for
1237the creation and inspection of package scoped variables.
1238
1239=over 4
1240
1241=item B<add_package_variable ($variable_name, ?$initial_value)>
1242
1243Given a C<$variable_name>, which must contain a leading sigil, this
1244method will create that variable within the package which houses the
1245class. It also takes an optional C<$initial_value>, which must be a
1246reference of the same type as the sigil of the C<$variable_name>
1247implies.
1248
1249=item B<get_package_variable ($variable_name)>
1250
1251This will return a reference to the package variable in
1252C<$variable_name>.
1253
1254=item B<has_package_variable ($variable_name)>
1255
1256Returns true (C<1>) if there is a package variable defined for
1257C<$variable_name>, and false (C<0>) otherwise.
1258
1259=item B<remove_package_variable ($variable_name)>
1260
1261This will attempt to remove the package variable at C<$variable_name>.
1262
1263=back
1264
857f87a7 1265=head2 Class closing
1266
1267=over 4
1268
1269=item B<is_mutable>
1270
1271=item B<is_immutable>
1272
1273=item B<make_immutable>
1274
1275=back
1276
8b978dd5 1277=head1 AUTHOR
1278
a2e85e6c 1279Stevan Little E<lt>stevan@iinteractive.comE<gt>
8b978dd5 1280
1281=head1 COPYRIGHT AND LICENSE
1282
1283Copyright 2006 by Infinity Interactive, Inc.
1284
1285L<http://www.iinteractive.com>
1286
1287This library is free software; you can redistribute it and/or modify
1288it under the same terms as Perl itself.
1289
798baea5 1290=cut