error_class is now the one true way
[gitmo/Moose.git] / lib / Moose / Meta / Class.pm
CommitLineData
c0e30cf5 1
2package Moose::Meta::Class;
3
4use strict;
5use warnings;
6
0addec44 7use Class::MOP;
648e79ae 8
11c86f15 9use Carp ();
f8b6827f 10use List::Util qw( first );
11use List::MoreUtils qw( any all );
21f1e231 12use Scalar::Util 'weaken', 'blessed';
a15dff8d 13
e606ae5f 14our $VERSION = '0.57';
15$VERSION = eval $VERSION;
d44714be 16our $AUTHORITY = 'cpan:STEVAN';
bc1e29b5 17
8ee73eeb 18use Moose::Meta::Method::Overriden;
3f9e4b0a 19use Moose::Meta::Method::Augmented;
bf6fa6b3 20use Moose::Error::Default;
8ee73eeb 21
c0e30cf5 22use base 'Class::MOP::Class';
23
598340d5 24__PACKAGE__->meta->add_attribute('roles' => (
ef333f17 25 reader => 'roles',
26 default => sub { [] }
27));
28
e606ae5f 29__PACKAGE__->meta->add_attribute('constructor_class' => (
30 accessor => 'constructor_class',
31 default => sub { 'Moose::Meta::Method::Constructor' }
32));
33
34__PACKAGE__->meta->add_attribute('destructor_class' => (
35 accessor => 'destructor_class',
36 default => sub { 'Moose::Meta::Method::Destructor' }
37));
38
11c86f15 39__PACKAGE__->meta->add_attribute('error_class' => (
bf6fa6b3 40 accessor => 'error_class',
41 default => 'Moose::Error::Default',
11c86f15 42));
43
44
590868a3 45sub initialize {
46 my $class = shift;
47 my $pkg = shift;
685f7e44 48 return Class::MOP::get_metaclass_by_name($pkg)
49 || $class->SUPER::initialize($pkg,
50 'attribute_metaclass' => 'Moose::Meta::Attribute',
51 'method_metaclass' => 'Moose::Meta::Method',
52 'instance_metaclass' => 'Moose::Meta::Instance',
53 @_
54 );
ac2dc464 55}
590868a3 56
61bdd94f 57sub create {
58 my ($self, $package_name, %options) = @_;
59
60 (ref $options{roles} eq 'ARRAY')
11c86f15 61 || $self->throw_error("You must pass an ARRAY ref of roles", data => $options{roles})
61bdd94f 62 if exists $options{roles};
dd37a5be 63
61bdd94f 64 my $class = $self->SUPER::create($package_name, %options);
dd37a5be 65
48045612 66 if (exists $options{roles}) {
61bdd94f 67 Moose::Util::apply_all_roles($class, @{$options{roles}});
68 }
69
70 return $class;
71}
72
2b72f3b4 73sub check_metaclass_compatibility {
74 my $self = shift;
75
76 if ( my @supers = $self->superclasses ) {
77 $self->_fix_metaclass_incompatibility(@supers);
78 }
79
80 $self->SUPER::check_metaclass_compatibility(@_);
81}
82
17594769 83my %ANON_CLASSES;
84
85sub create_anon_class {
86 my ($self, %options) = @_;
87
88 my $cache_ok = delete $options{cache};
17594769 89
90 # something like Super::Class|Super::Class::2=Role|Role::1
91 my $cache_key = join '=' => (
6d5cbd2b 92 join('|', sort @{$options{superclasses} || []}),
93 join('|', sort @{$options{roles} || []}),
17594769 94 );
95
6d5cbd2b 96 if ($cache_ok && defined $ANON_CLASSES{$cache_key}) {
17594769 97 return $ANON_CLASSES{$cache_key};
98 }
99
100 my $new_class = $self->SUPER::create_anon_class(%options);
101
6d5cbd2b 102 $ANON_CLASSES{$cache_key} = $new_class
103 if $cache_ok;
17594769 104
105 return $new_class;
106}
107
ef333f17 108sub add_role {
109 my ($self, $role) = @_;
110 (blessed($role) && $role->isa('Moose::Meta::Role'))
11c86f15 111 || $self->throw_error("Roles must be instances of Moose::Meta::Role", data => $role);
ef333f17 112 push @{$self->roles} => $role;
113}
114
b8aeb4dc 115sub calculate_all_roles {
116 my $self = shift;
117 my %seen;
118 grep { !$seen{$_->name}++ } map { $_->calculate_all_roles } @{ $self->roles };
119}
120
ef333f17 121sub does_role {
122 my ($self, $role_name) = @_;
123 (defined $role_name)
11c86f15 124 || $self->throw_error("You must supply a role name to look for");
9c429218 125 foreach my $class ($self->class_precedence_list) {
81c3738f 126 next unless $class->can('meta') && $class->meta->can('roles');
9c429218 127 foreach my $role (@{$class->meta->roles}) {
128 return 1 if $role->does_role($role_name);
129 }
ef333f17 130 }
131 return 0;
132}
133
d79e62fd 134sub excludes_role {
135 my ($self, $role_name) = @_;
136 (defined $role_name)
11c86f15 137 || $self->throw_error("You must supply a role name to look for");
ac2dc464 138 foreach my $class ($self->class_precedence_list) {
139 next unless $class->can('meta');
5cb193ed 140 # NOTE:
141 # in the pretty rare instance when a Moose metaclass
ac2dc464 142 # is itself extended with a role, this check needs to
5cb193ed 143 # be done since some items in the class_precedence_list
ac2dc464 144 # might in fact be Class::MOP based still.
145 next unless $class->meta->can('roles');
9c429218 146 foreach my $role (@{$class->meta->roles}) {
147 return 1 if $role->excludes_role($role_name);
148 }
d79e62fd 149 }
150 return 0;
151}
152
8c9d74e7 153sub new_object {
e606ae5f 154 my $class = shift;
155 my $params = @_ == 1 ? $_[0] : {@_};
156 my $self = $class->SUPER::new_object($params);
8c9d74e7 157 foreach my $attr ($class->compute_all_applicable_attributes()) {
4078709c 158 # if we have a trigger, then ...
159 if ($attr->can('has_trigger') && $attr->has_trigger) {
160 # make sure we have an init-arg ...
161 if (defined(my $init_arg = $attr->init_arg)) {
162 # now make sure an init-arg was passes ...
e606ae5f 163 if (exists $params->{$init_arg}) {
4078709c 164 # and if get here, fire the trigger
165 $attr->trigger->(
166 $self,
167 # check if there is a coercion
168 ($attr->should_coerce
169 # and if so, we need to grab the
170 # value that is actually been stored
171 ? $attr->get_read_method_ref->($self)
172 # otherwise, just get the value from
173 # the constructor params
e606ae5f 174 : $params->{$init_arg}),
4078709c 175 $attr
176 );
177 }
178 }
625d571f 179 }
8c9d74e7 180 }
ac2dc464 181 return $self;
8c9d74e7 182}
183
a15dff8d 184sub construct_instance {
e606ae5f 185 my $class = shift;
186 my $params = @_ == 1 ? $_[0] : {@_};
ddd0ec20 187 my $meta_instance = $class->get_meta_instance;
575db57d 188 # FIXME:
189 # the code below is almost certainly incorrect
190 # but this is foreign inheritence, so we might
ac2dc464 191 # have to kludge it in the end.
e606ae5f 192 my $instance = $params->{'__INSTANCE__'} || $meta_instance->create_instance();
ac2dc464 193 foreach my $attr ($class->compute_all_applicable_attributes()) {
e606ae5f 194 $attr->initialize_instance_slot($meta_instance, $instance, $params);
a15dff8d 195 }
196 return $instance;
197}
198
093b12c2 199# FIXME:
200# This is ugly
ac2dc464 201sub get_method_map {
093b12c2 202 my $self = shift;
53dd42d8 203
e606ae5f 204 my $current = Class::MOP::check_package_cache_flag($self->name);
205
206 if (defined $self->{'_package_cache_flag'} && $self->{'_package_cache_flag'} == $current) {
207 return $self->{'methods'};
53dd42d8 208 }
209
e606ae5f 210 $self->{_package_cache_flag} = $current;
211
212 my $map = $self->{'methods'};
ac2dc464 213
093b12c2 214 my $class_name = $self->name;
215 my $method_metaclass = $self->method_metaclass;
ac2dc464 216
0addec44 217 my %all_code = $self->get_all_package_symbols('CODE');
ac2dc464 218
0addec44 219 foreach my $symbol (keys %all_code) {
220 my $code = $all_code{$symbol};
ac2dc464 221
222 next if exists $map->{$symbol} &&
223 defined $map->{$symbol} &&
224 $map->{$symbol}->body == $code;
225
53dd42d8 226 my ($pkg, $name) = Class::MOP::get_code_info($code);
ac2dc464 227
53dd42d8 228 if ($pkg->can('meta')
4f8f3aab 229 # NOTE:
230 # we don't know what ->meta we are calling
53dd42d8 231 # here, so we need to be careful cause it
232 # just might blow up at us, or just complain
233 # loudly (in the case of Curses.pm) so we
4f8f3aab 234 # just be a little overly cautious here.
235 # - SL
236 && eval { no warnings; blessed($pkg->meta) }
237 && $pkg->meta->isa('Moose::Meta::Role')) {
093b12c2 238 #my $role = $pkg->meta->name;
239 #next unless $self->does_role($role);
240 }
241 else {
2887c827 242
243 # NOTE:
244 # in 5.10 constant.pm the constants show up
245 # as being in the right package, but in pre-5.10
246 # they show up as constant::__ANON__ so we
247 # make an exception here to be sure that things
248 # work as expected in both.
249 # - SL
250 unless ($pkg eq 'constant' && $name eq '__ANON__') {
251 next if ($pkg || '') ne $class_name ||
252 (($name || '') ne '__ANON__' && ($pkg || '') ne $class_name);
253 }
53dd42d8 254
093b12c2 255 }
ac2dc464 256
1b2aea39 257 $map->{$symbol} = $method_metaclass->wrap(
258 $code,
259 package_name => $class_name,
260 name => $symbol
261 );
093b12c2 262 }
ac2dc464 263
093b12c2 264 return $map;
a7d0cd00 265}
266
093b12c2 267### ---------------------------------------------
268
a2eec5e7 269sub add_attribute {
270 my $self = shift;
e472c9a5 271 $self->SUPER::add_attribute(
272 (blessed $_[0] && $_[0]->isa('Class::MOP::Attribute')
273 ? $_[0]
274 : $self->_process_attribute(@_))
275 );
a2eec5e7 276}
277
78cd1d3b 278sub add_override_method_modifier {
279 my ($self, $name, $method, $_super_package) = @_;
18c2ec0e 280
d05cd563 281 (!$self->has_method($name))
11c86f15 282 || $self->throw_error("Cannot add an override method if a local method is already present");
18c2ec0e 283
284 $self->add_method($name => Moose::Meta::Method::Overriden->new(
3f9e4b0a 285 method => $method,
286 class => $self,
287 package => $_super_package, # need this for roles
288 name => $name,
18c2ec0e 289 ));
78cd1d3b 290}
291
292sub add_augment_method_modifier {
ac2dc464 293 my ($self, $name, $method) = @_;
d05cd563 294 (!$self->has_method($name))
11c86f15 295 || $self->throw_error("Cannot add an augment method if a local method is already present");
3f9e4b0a 296
297 $self->add_method($name => Moose::Meta::Method::Augmented->new(
298 method => $method,
299 class => $self,
300 name => $name,
301 ));
78cd1d3b 302}
303
1341f10c 304## Private Utility methods ...
305
05d9eaf6 306sub _find_next_method_by_name_which_is_not_overridden {
307 my ($self, $name) = @_;
68efb014 308 foreach my $method ($self->find_all_methods_by_name($name)) {
ac2dc464 309 return $method->{code}
05d9eaf6 310 if blessed($method->{code}) && !$method->{code}->isa('Moose::Meta::Method::Overriden');
311 }
312 return undef;
313}
314
41419b9e 315sub _fix_metaclass_incompatibility {
1341f10c 316 my ($self, @superclasses) = @_;
e606ae5f 317
1341f10c 318 foreach my $super (@superclasses) {
f8b6827f 319 next if $self->_superclass_meta_is_compatible($super);
e606ae5f 320
321 unless ( $self->is_pristine ) {
f8b6827f 322 $self->throw_error(
323 "Cannot attempt to reinitialize metaclass for "
324 . $self->name
325 . ", it isn't pristine" );
1341f10c 326 }
e606ae5f 327
0635500e 328 $self->_reconcile_with_superclass_meta($super);
f8b6827f 329 }
f8b6827f 330}
331
332sub _superclass_meta_is_compatible {
333 my ($self, $super) = @_;
334
335 my $super_meta = Class::MOP::Class->initialize($super)
336 or return 1;
337
338 next unless $super_meta->isa("Class::MOP::Class");
339
340 my $super_meta_name
341 = $super_meta->is_immutable
342 ? $super_meta->get_mutable_metaclass_name
343 : ref($super_meta);
344
345 return 1
346 if $self->isa($super_meta_name)
347 and
348 $self->instance_metaclass->isa( $super_meta->instance_metaclass );
349}
350
351# I don't want to have to type this >1 time
352my @MetaClassTypes =
353 qw( attribute_metaclass method_metaclass instance_metaclass constructor_class destructor_class );
354
355sub _reconcile_with_superclass_meta {
356 my ($self, $super) = @_;
357
358 my $super_meta = $super->meta;
359
dd37a5be 360 my $super_meta_name
f8b6827f 361 = $super_meta->is_immutable
362 ? $super_meta->get_mutable_metaclass_name
363 : ref($super_meta);
e606ae5f 364
f8b6827f 365 my $self_metaclass = ref $self;
366
367 # If neither of these is true we have a more serious
368 # incompatibility that we just cannot fix (yet?).
dd37a5be 369 if ( $super_meta_name->isa( ref $self )
f8b6827f 370 && all { $super_meta->$_->isa( $self->$_ ) } @MetaClassTypes ) {
0635500e 371 $self->_reinitialize_with($super_meta);
f8b6827f 372 }
373 elsif ( $self->_all_metaclasses_differ_by_roles_only($super_meta) ) {
0635500e 374 $self->_reconcile_role_differences($super_meta);
1341f10c 375 }
1341f10c 376}
377
f8b6827f 378sub _reinitialize_with {
379 my ( $self, $new_meta ) = @_;
380
0635500e 381 my $new_self = $new_meta->reinitialize(
f8b6827f 382 $self->name,
383 attribute_metaclass => $new_meta->attribute_metaclass,
384 method_metaclass => $new_meta->method_metaclass,
385 instance_metaclass => $new_meta->instance_metaclass,
386 );
387
0635500e 388 $new_self->$_( $new_meta->$_ ) for qw( constructor_class destructor_class );
f8b6827f 389
0635500e 390 %$self = %$new_self;
391
392 bless $self, ref $new_self;
393
4c5fcc12 394 # We need to replace the cached metaclass instance or else when it
395 # goes out of scope Class::MOP::Class destroy's the namespace for
396 # the metaclass's class, causing much havoc.
0635500e 397 Class::MOP::store_metaclass_by_name( $self->name, $self );
4c5fcc12 398 Class::MOP::weaken_metaclass( $self->name ) if $self->is_anon_class;
f8b6827f 399}
400
401# In the more complex case, we share a common ancestor with our
402# superclass's metaclass, but each metaclass (ours and the parent's)
403# has a different set of roles applied. We reconcile this by first
404# reinitializing into the parent class, and _then_ applying our own
405# roles.
406sub _all_metaclasses_differ_by_roles_only {
407 my ($self, $super_meta) = @_;
408
409 for my $pair (
410 [ ref $self, ref $super_meta ],
411 map { [ $self->$_, $super_meta->$_ ] } @MetaClassTypes
412 ) {
413
414 next if $pair->[0] eq $pair->[1];
415
416 my $self_meta_meta = Class::MOP::Class->initialize( $pair->[0] );
417 my $super_meta_meta = Class::MOP::Class->initialize( $pair->[1] );
418
419 my $common_ancestor
420 = _find_common_ancestor( $self_meta_meta, $super_meta_meta );
421
422 return unless $common_ancestor;
423
424 return
425 unless _is_role_only_subclass_of(
426 $self_meta_meta,
427 $common_ancestor,
428 )
429 && _is_role_only_subclass_of(
430 $super_meta_meta,
431 $common_ancestor,
432 );
433 }
434
435 return 1;
436}
437
438# This, and some other functions, could be called as methods, but
439# they're not for two reasons. One, we just end up ignoring the first
440# argument, because we can't call these directly on one of the real
441# arguments, because one of them could be a Class::MOP::Class object
442# and not a Moose::Meta::Class. Second, only a completely insane
443# person would attempt to subclass this stuff!
444sub _find_common_ancestor {
445 my ($meta1, $meta2) = @_;
446
447 # FIXME? This doesn't account for multiple inheritance (not sure
448 # if it needs to though). For example, is somewhere in $meta1's
449 # history it inherits from both ClassA and ClassB, and $meta
450 # inherits from ClassB & ClassA, does it matter? And what crazy
451 # fool would do that anyway?
452
453 my %meta1_parents = map { $_ => 1 } $meta1->linearized_isa;
454
455 return first { $meta1_parents{$_} } $meta2->linearized_isa;
456}
457
458sub _is_role_only_subclass_of {
459 my ($meta, $ancestor) = @_;
460
461 return 1 if $meta->name eq $ancestor;
462
463 my @roles = _all_roles_until( $meta, $ancestor );
464
465 my %role_packages = map { $_->name => 1 } @roles;
466
467 my $ancestor_meta = Class::MOP::Class->initialize($ancestor);
468
469 my %shared_ancestors = map { $_ => 1 } $ancestor_meta->linearized_isa;
470
471 for my $method ( $meta->get_all_methods() ) {
472 next if $method->name eq 'meta';
473 next if $method->can('associated_attribute');
474
475 next
476 if $role_packages{ $method->original_package_name }
477 || $shared_ancestors{ $method->original_package_name };
478
479 return 0;
480 }
481
482 # FIXME - this really isn't right. Just because an attribute is
483 # defined in a role doesn't mean it isn't _also_ defined in the
484 # subclass.
485 for my $attr ( $meta->get_all_attributes ) {
486 next if $shared_ancestors{ $attr->associated_class->name };
487
488 next if any { $_->has_attribute( $attr->name ) } @roles;
489
490 return 0;
491 }
492
493 return 1;
494}
495
496sub _all_roles {
497 my $meta = shift;
498
499 return _all_roles_until($meta);
500}
501
502sub _all_roles_until {
503 my ($meta, $stop_at_class) = @_;
504
505 return unless $meta->can('calculate_all_roles');
506
507 my @roles = $meta->calculate_all_roles;
508
509 for my $class ( $meta->linearized_isa ) {
510 last if $stop_at_class && $stop_at_class eq $class;
511
512 my $meta = Class::MOP::Class->initialize($class);
513 last unless $meta->can('calculate_all_roles');
514
515 push @roles, $meta->calculate_all_roles;
516 }
517
518 return @roles;
519}
520
521sub _reconcile_role_differences {
522 my ($self, $super_meta) = @_;
523
524 my $self_meta = $self->meta;
525
526 my %roles;
527
528 if ( my @roles = map { $_->name } _all_roles($self_meta) ) {
529 $roles{metaclass_roles} = \@roles;
530 }
531
532 for my $thing (@MetaClassTypes) {
533 my $name = $self->$thing();
534
535 my $thing_meta = Class::MOP::Class->initialize($name);
536
537 my @roles = map { $_->name } _all_roles($thing_meta)
538 or next;
539
540 $roles{ $thing . '_roles' } = \@roles;
541 }
542
2b72f3b4 543 $self->_reinitialize_with($super_meta);
f8b6827f 544
545 Moose::Util::MetaRole::apply_metaclass_roles(
546 for_class => $self->name,
547 %roles,
548 );
549
550 return $self;
551}
552
d7d8a8c7 553# NOTE:
d9bb6c63 554# this was crap anyway, see
555# Moose::Util::apply_all_roles
d7d8a8c7 556# instead
4498537c 557sub _apply_all_roles {
547dda77 558 Carp::croak 'DEPRECATED: use Moose::Util::apply_all_roles($meta, @roles) instead'
4498537c 559}
1341f10c 560
561sub _process_attribute {
a3738e5b 562 my ( $self, $name, @args ) = @_;
7e59b803 563
564 @args = %{$args[0]} if scalar @args == 1 && ref($args[0]) eq 'HASH';
d9bb6c63 565
1341f10c 566 if ($name =~ /^\+(.*)/) {
7e59b803 567 return $self->_process_inherited_attribute($1, @args);
1341f10c 568 }
569 else {
7e59b803 570 return $self->_process_new_attribute($name, @args);
571 }
572}
573
574sub _process_new_attribute {
575 my ( $self, $name, @args ) = @_;
7e59b803 576
d5c30e52 577 $self->attribute_metaclass->interpolate_class_and_new($name, @args);
1341f10c 578}
579
580sub _process_inherited_attribute {
581 my ($self, $attr_name, %options) = @_;
582 my $inherited_attr = $self->find_attribute_by_name($attr_name);
583 (defined $inherited_attr)
11c86f15 584 || $self->throw_error("Could not find an attribute by the name of '$attr_name' to inherit from", data => $attr_name);
1341f10c 585 if ($inherited_attr->isa('Moose::Meta::Attribute')) {
d7d8a8c7 586 return $inherited_attr->clone_and_inherit_options(%options);
1341f10c 587 }
588 else {
589 # NOTE:
590 # kind of a kludge to handle Class::MOP::Attributes
d7d8a8c7 591 return $inherited_attr->Moose::Meta::Attribute::clone_and_inherit_options(%options);
ac2dc464 592 }
1341f10c 593}
594
5cf3dbcf 595## -------------------------------------------------
596
597use Moose::Meta::Method::Constructor;
1f779926 598use Moose::Meta::Method::Destructor;
5cf3dbcf 599
ac2dc464 600# This could be done by using SUPER and altering ->options
601# I am keeping it this way to make it more explicit.
602sub create_immutable_transformer {
603 my $self = shift;
604 my $class = Class::MOP::Immutable->new($self, {
e606ae5f 605 read_only => [qw/superclasses/],
606 cannot_call => [qw/
607 add_method
608 alias_method
609 remove_method
610 add_attribute
611 remove_attribute
612 remove_package_symbol
613 add_role
614 /],
615 memoize => {
616 class_precedence_list => 'ARRAY',
617 linearized_isa => 'ARRAY', # FIXME perl 5.10 memoizes this on its own, no need?
618 get_all_methods => 'ARRAY',
619 #get_all_attributes => 'ARRAY', # it's an alias, no need, but maybe in the future
620 compute_all_applicable_attributes => 'ARRAY',
621 get_meta_instance => 'SCALAR',
622 get_method_map => 'SCALAR',
623 calculate_all_roles => 'ARRAY',
624 },
625 # NOTE:
626 # this is ugly, but so are typeglobs,
627 # so whattayahgonnadoboutit
628 # - SL
629 wrapped => {
630 add_package_symbol => sub {
631 my $original = shift;
632 $self->throw_error("Cannot add package symbols to an immutable metaclass")
633 unless (caller(2))[3] eq 'Class::MOP::Package::get_package_symbol';
634 goto $original->body;
635 },
636 },
ac2dc464 637 });
638 return $class;
639}
640
641sub make_immutable {
642 my $self = shift;
643 $self->SUPER::make_immutable
644 (
e606ae5f 645 constructor_class => $self->constructor_class,
646 destructor_class => $self->destructor_class,
ac2dc464 647 inline_destructor => 1,
648 # NOTE:
649 # no need to do this,
650 # Moose always does it
651 inline_accessors => 0,
652 @_,
653 );
5cf3dbcf 654}
655
11c86f15 656#{ package Moose::Meta::Class::ErrorRoutines; %Carp::Internal?
657
bf6fa6b3 658our $error_level;
11c86f15 659
660sub throw_error {
661 my ( $self, @args ) = @_;
bf6fa6b3 662 local $error_level = ($error_level || 0) + 1;
11c86f15 663 $self->raise_error($self->create_error(@args));
664}
665
666sub raise_error {
667 my ( $self, @args ) = @_;
668 die @args;
669}
670
671sub create_error {
672 my ( $self, @args ) = @_;
673
18748ad6 674 require Carp::Heavy;
675
bf6fa6b3 676 local $error_level = ($error_level || 0 ) + 1;
18748ad6 677
11c86f15 678 if ( @args % 2 == 1 ) {
679 unshift @args, "message";
680 }
681
bf6fa6b3 682 my %args = ( metaclass => $self, error => $@, @args );
11c86f15 683
bf6fa6b3 684 $args{depth} += $error_level;
11c86f15 685
bf6fa6b3 686 my $class = ref $self ? $self->error_class : "Moose::Error::Default";
11c86f15 687
688 $class->new(
bf6fa6b3 689 Carp::caller_info($args{depth}),
690 %args
11c86f15 691 );
692}
693
c0e30cf5 6941;
695
696__END__
697
698=pod
699
700=head1 NAME
701
e522431d 702Moose::Meta::Class - The Moose metaclass
c0e30cf5 703
c0e30cf5 704=head1 DESCRIPTION
705
ac2dc464 706This is a subclass of L<Class::MOP::Class> with Moose specific
e522431d 707extensions.
708
ac2dc464 709For the most part, the only time you will ever encounter an
710instance of this class is if you are doing some serious deep
711introspection. To really understand this class, you need to refer
6ba6d68c 712to the L<Class::MOP::Class> documentation.
713
c0e30cf5 714=head1 METHODS
715
716=over 4
717
590868a3 718=item B<initialize>
719
61bdd94f 720=item B<create>
721
17594769 722Overrides original to accept a list of roles to apply to
61bdd94f 723the created class.
724
17594769 725 my $metaclass = Moose::Meta::Class->create( 'New::Class', roles => [...] );
726
727=item B<create_anon_class>
728
729Overrides original to support roles and caching.
730
731 my $metaclass = Moose::Meta::Class->create_anon_class(
732 superclasses => ['Foo'],
733 roles => [qw/Some Roles Go Here/],
734 cache => 1,
735 );
736
5cf3dbcf 737=item B<make_immutable>
738
ac2dc464 739Override original to add default options for inlining destructor
740and altering the Constructor metaclass.
741
742=item B<create_immutable_transformer>
743
744Override original to lock C<add_role> and memoize C<calculate_all_roles>
745
8c9d74e7 746=item B<new_object>
747
02a0fb52 748We override this method to support the C<trigger> attribute option.
749
a15dff8d 750=item B<construct_instance>
751
ac2dc464 752This provides some Moose specific extensions to this method, you
753almost never call this method directly unless you really know what
754you are doing.
6ba6d68c 755
756This method makes sure to handle the moose weak-ref, type-constraint
ac2dc464 757and type coercion features.
ef1d5f4b 758
093b12c2 759=item B<get_method_map>
e9ec68d6 760
ac2dc464 761This accommodates Moose::Meta::Role::Method instances, which are
762aliased, instead of added, but still need to be counted as valid
e9ec68d6 763methods.
764
78cd1d3b 765=item B<add_override_method_modifier ($name, $method)>
766
ac2dc464 767This will create an C<override> method modifier for you, and install
02a0fb52 768it in the package.
769
78cd1d3b 770=item B<add_augment_method_modifier ($name, $method)>
771
ac2dc464 772This will create an C<augment> method modifier for you, and install
02a0fb52 773it in the package.
774
2b14ac61 775=item B<calculate_all_roles>
776
ef333f17 777=item B<roles>
778
ac2dc464 779This will return an array of C<Moose::Meta::Role> instances which are
02a0fb52 780attached to this class.
781
ef333f17 782=item B<add_role ($role)>
783
ac2dc464 784This takes an instance of C<Moose::Meta::Role> in C<$role>, and adds it
02a0fb52 785to the list of associated roles.
786
ef333f17 787=item B<does_role ($role_name)>
788
ac2dc464 789This will test if this class C<does> a given C<$role_name>. It will
790not only check it's local roles, but ask them as well in order to
02a0fb52 791cascade down the role hierarchy.
792
d79e62fd 793=item B<excludes_role ($role_name)>
794
ac2dc464 795This will test if this class C<excludes> a given C<$role_name>. It will
796not only check it's local roles, but ask them as well in order to
d79e62fd 797cascade down the role hierarchy.
798
9e93dd19 799=item B<add_attribute ($attr_name, %params|$params)>
4e848edb 800
9e93dd19 801This method does the same thing as L<Class::MOP::Class::add_attribute>, but adds
802support for taking the C<$params> as a HASH ref.
ac1ef2f9 803
e606ae5f 804=item B<constructor_class ($class_name)>
805
806=item B<destructor_class ($class_name)>
807
808These are the names of classes used when making a class
809immutable. These default to L<Moose::Meta::Method::Constructor> and
810L<Moose::Meta::Method::Destructor> respectively. These accessors are
811read-write, so you can use them to change the class name.
812
4fb87686 813=item B<check_metaclass_compatibility>
814
815Moose overrides this method from C<Class::MOP::Class> and attempts to
816fix some incompatibilities before doing the check.
817
11c86f15 818=item B<throw_error $message, %extra>
819
820Throws the error created by C<create_error> using C<raise_error>
821
822=item B<create_error $message, %extra>
823
824Creates an error message or object.
825
826The default behavior is C<create_error_confess>.
827
828If C<error_class> is set uses C<create_error_object>. Otherwise uses
829C<error_builder> (a code reference or variant name), and calls the appropriate
830C<create_error_$builder> method.
831
832=item B<error_builder $builder_name>
833
834Get or set the error builder. Defaults to C<confess>.
835
836=item B<error_class $class_name>
837
838Get or set the error class. Has no default.
839
840=item B<create_error_confess %args>
841
842Creates an error using L<Carp/longmess>
843
844=item B<create_error_croak %args>
845
846Creates an error using L<Carp/shortmess>
847
848=item B<create_error_object %args>
849
850Calls C<new> on the C<class> parameter in C<%args>. Usable with C<error_class>
851to support custom error objects for your meta class.
852
853=item B<raise_error $error>
854
855Dies with an error object or string.
856
c0e30cf5 857=back
858
859=head1 BUGS
860
ac2dc464 861All complex software has bugs lurking in it, and this module is no
c0e30cf5 862exception. If you find a bug please either email me, or add the bug
863to cpan-RT.
864
c0e30cf5 865=head1 AUTHOR
866
867Stevan Little E<lt>stevan@iinteractive.comE<gt>
868
869=head1 COPYRIGHT AND LICENSE
870
778db3ac 871Copyright 2006-2008 by Infinity Interactive, Inc.
c0e30cf5 872
873L<http://www.iinteractive.com>
874
875This library is free software; you can redistribute it and/or modify
ac2dc464 876it under the same terms as Perl itself.
c0e30cf5 877
8a7a9c53 878=cut
1a563243 879