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