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