Make regexes line up nicely
[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 );
8b1d510f 11use List::MoreUtils qw( any all uniq );
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',
e0001338 31 default => 'Moose::Meta::Method::Constructor',
e606ae5f 32));
33
34__PACKAGE__->meta->add_attribute('destructor_class' => (
35 accessor => 'destructor_class',
e0001338 36 default => 'Moose::Meta::Method::Destructor',
e606ae5f 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 =
8b1d510f 353 qw( attribute_metaclass method_metaclass instance_metaclass
354 constructor_class destructor_class error_class );
f8b6827f 355
356sub _reconcile_with_superclass_meta {
357 my ($self, $super) = @_;
358
359 my $super_meta = $super->meta;
360
dd37a5be 361 my $super_meta_name
f8b6827f 362 = $super_meta->is_immutable
363 ? $super_meta->get_mutable_metaclass_name
364 : ref($super_meta);
e606ae5f 365
f8b6827f 366 my $self_metaclass = ref $self;
367
368 # If neither of these is true we have a more serious
369 # incompatibility that we just cannot fix (yet?).
dd37a5be 370 if ( $super_meta_name->isa( ref $self )
f8b6827f 371 && all { $super_meta->$_->isa( $self->$_ ) } @MetaClassTypes ) {
0635500e 372 $self->_reinitialize_with($super_meta);
f8b6827f 373 }
374 elsif ( $self->_all_metaclasses_differ_by_roles_only($super_meta) ) {
0635500e 375 $self->_reconcile_role_differences($super_meta);
1341f10c 376 }
1341f10c 377}
378
f8b6827f 379sub _reinitialize_with {
380 my ( $self, $new_meta ) = @_;
381
0635500e 382 my $new_self = $new_meta->reinitialize(
f8b6827f 383 $self->name,
384 attribute_metaclass => $new_meta->attribute_metaclass,
385 method_metaclass => $new_meta->method_metaclass,
386 instance_metaclass => $new_meta->instance_metaclass,
387 );
388
8b1d510f 389 $new_self->$_( $new_meta->$_ )
390 for qw( constructor_class destructor_class error_class );
f8b6827f 391
0635500e 392 %$self = %$new_self;
393
394 bless $self, ref $new_self;
395
4c5fcc12 396 # We need to replace the cached metaclass instance or else when it
397 # goes out of scope Class::MOP::Class destroy's the namespace for
398 # the metaclass's class, causing much havoc.
0635500e 399 Class::MOP::store_metaclass_by_name( $self->name, $self );
4c5fcc12 400 Class::MOP::weaken_metaclass( $self->name ) if $self->is_anon_class;
f8b6827f 401}
402
403# In the more complex case, we share a common ancestor with our
404# superclass's metaclass, but each metaclass (ours and the parent's)
405# has a different set of roles applied. We reconcile this by first
406# reinitializing into the parent class, and _then_ applying our own
407# roles.
408sub _all_metaclasses_differ_by_roles_only {
409 my ($self, $super_meta) = @_;
410
411 for my $pair (
412 [ ref $self, ref $super_meta ],
413 map { [ $self->$_, $super_meta->$_ ] } @MetaClassTypes
414 ) {
415
416 next if $pair->[0] eq $pair->[1];
417
418 my $self_meta_meta = Class::MOP::Class->initialize( $pair->[0] );
419 my $super_meta_meta = Class::MOP::Class->initialize( $pair->[1] );
420
421 my $common_ancestor
422 = _find_common_ancestor( $self_meta_meta, $super_meta_meta );
423
424 return unless $common_ancestor;
425
426 return
427 unless _is_role_only_subclass_of(
428 $self_meta_meta,
429 $common_ancestor,
430 )
431 && _is_role_only_subclass_of(
432 $super_meta_meta,
433 $common_ancestor,
434 );
435 }
436
437 return 1;
438}
439
440# This, and some other functions, could be called as methods, but
441# they're not for two reasons. One, we just end up ignoring the first
442# argument, because we can't call these directly on one of the real
443# arguments, because one of them could be a Class::MOP::Class object
444# and not a Moose::Meta::Class. Second, only a completely insane
445# person would attempt to subclass this stuff!
446sub _find_common_ancestor {
447 my ($meta1, $meta2) = @_;
448
449 # FIXME? This doesn't account for multiple inheritance (not sure
450 # if it needs to though). For example, is somewhere in $meta1's
451 # history it inherits from both ClassA and ClassB, and $meta
452 # inherits from ClassB & ClassA, does it matter? And what crazy
453 # fool would do that anyway?
454
455 my %meta1_parents = map { $_ => 1 } $meta1->linearized_isa;
456
457 return first { $meta1_parents{$_} } $meta2->linearized_isa;
458}
459
460sub _is_role_only_subclass_of {
461 my ($meta, $ancestor) = @_;
462
463 return 1 if $meta->name eq $ancestor;
464
465 my @roles = _all_roles_until( $meta, $ancestor );
466
467 my %role_packages = map { $_->name => 1 } @roles;
468
469 my $ancestor_meta = Class::MOP::Class->initialize($ancestor);
470
471 my %shared_ancestors = map { $_ => 1 } $ancestor_meta->linearized_isa;
472
473 for my $method ( $meta->get_all_methods() ) {
474 next if $method->name eq 'meta';
475 next if $method->can('associated_attribute');
476
477 next
478 if $role_packages{ $method->original_package_name }
479 || $shared_ancestors{ $method->original_package_name };
480
481 return 0;
482 }
483
484 # FIXME - this really isn't right. Just because an attribute is
485 # defined in a role doesn't mean it isn't _also_ defined in the
486 # subclass.
487 for my $attr ( $meta->get_all_attributes ) {
488 next if $shared_ancestors{ $attr->associated_class->name };
489
490 next if any { $_->has_attribute( $attr->name ) } @roles;
491
492 return 0;
493 }
494
495 return 1;
496}
497
498sub _all_roles {
499 my $meta = shift;
500
501 return _all_roles_until($meta);
502}
503
504sub _all_roles_until {
505 my ($meta, $stop_at_class) = @_;
506
507 return unless $meta->can('calculate_all_roles');
508
509 my @roles = $meta->calculate_all_roles;
510
511 for my $class ( $meta->linearized_isa ) {
512 last if $stop_at_class && $stop_at_class eq $class;
513
514 my $meta = Class::MOP::Class->initialize($class);
515 last unless $meta->can('calculate_all_roles');
516
517 push @roles, $meta->calculate_all_roles;
518 }
519
8b1d510f 520 return uniq @roles;
f8b6827f 521}
522
523sub _reconcile_role_differences {
524 my ($self, $super_meta) = @_;
525
526 my $self_meta = $self->meta;
527
528 my %roles;
529
530 if ( my @roles = map { $_->name } _all_roles($self_meta) ) {
531 $roles{metaclass_roles} = \@roles;
532 }
533
534 for my $thing (@MetaClassTypes) {
535 my $name = $self->$thing();
536
537 my $thing_meta = Class::MOP::Class->initialize($name);
538
539 my @roles = map { $_->name } _all_roles($thing_meta)
540 or next;
541
542 $roles{ $thing . '_roles' } = \@roles;
543 }
544
2b72f3b4 545 $self->_reinitialize_with($super_meta);
f8b6827f 546
547 Moose::Util::MetaRole::apply_metaclass_roles(
548 for_class => $self->name,
549 %roles,
550 );
551
552 return $self;
553}
554
d7d8a8c7 555# NOTE:
d9bb6c63 556# this was crap anyway, see
557# Moose::Util::apply_all_roles
d7d8a8c7 558# instead
4498537c 559sub _apply_all_roles {
547dda77 560 Carp::croak 'DEPRECATED: use Moose::Util::apply_all_roles($meta, @roles) instead'
4498537c 561}
1341f10c 562
563sub _process_attribute {
a3738e5b 564 my ( $self, $name, @args ) = @_;
7e59b803 565
566 @args = %{$args[0]} if scalar @args == 1 && ref($args[0]) eq 'HASH';
d9bb6c63 567
f9b5f5f8 568 if (($name || '') =~ /^\+(.*)/) {
7e59b803 569 return $self->_process_inherited_attribute($1, @args);
1341f10c 570 }
571 else {
7e59b803 572 return $self->_process_new_attribute($name, @args);
573 }
574}
575
576sub _process_new_attribute {
577 my ( $self, $name, @args ) = @_;
7e59b803 578
d5c30e52 579 $self->attribute_metaclass->interpolate_class_and_new($name, @args);
1341f10c 580}
581
582sub _process_inherited_attribute {
583 my ($self, $attr_name, %options) = @_;
584 my $inherited_attr = $self->find_attribute_by_name($attr_name);
585 (defined $inherited_attr)
11c86f15 586 || $self->throw_error("Could not find an attribute by the name of '$attr_name' to inherit from", data => $attr_name);
1341f10c 587 if ($inherited_attr->isa('Moose::Meta::Attribute')) {
d7d8a8c7 588 return $inherited_attr->clone_and_inherit_options(%options);
1341f10c 589 }
590 else {
591 # NOTE:
592 # kind of a kludge to handle Class::MOP::Attributes
d7d8a8c7 593 return $inherited_attr->Moose::Meta::Attribute::clone_and_inherit_options(%options);
ac2dc464 594 }
1341f10c 595}
596
5cf3dbcf 597## -------------------------------------------------
598
599use Moose::Meta::Method::Constructor;
1f779926 600use Moose::Meta::Method::Destructor;
5cf3dbcf 601
ac2dc464 602# This could be done by using SUPER and altering ->options
603# I am keeping it this way to make it more explicit.
604sub create_immutable_transformer {
605 my $self = shift;
606 my $class = Class::MOP::Immutable->new($self, {
e606ae5f 607 read_only => [qw/superclasses/],
608 cannot_call => [qw/
609 add_method
610 alias_method
611 remove_method
612 add_attribute
613 remove_attribute
614 remove_package_symbol
615 add_role
616 /],
617 memoize => {
618 class_precedence_list => 'ARRAY',
619 linearized_isa => 'ARRAY', # FIXME perl 5.10 memoizes this on its own, no need?
620 get_all_methods => 'ARRAY',
621 #get_all_attributes => 'ARRAY', # it's an alias, no need, but maybe in the future
622 compute_all_applicable_attributes => 'ARRAY',
623 get_meta_instance => 'SCALAR',
624 get_method_map => 'SCALAR',
625 calculate_all_roles => 'ARRAY',
626 },
627 # NOTE:
628 # this is ugly, but so are typeglobs,
629 # so whattayahgonnadoboutit
630 # - SL
631 wrapped => {
632 add_package_symbol => sub {
633 my $original = shift;
634 $self->throw_error("Cannot add package symbols to an immutable metaclass")
635 unless (caller(2))[3] eq 'Class::MOP::Package::get_package_symbol';
636 goto $original->body;
637 },
638 },
ac2dc464 639 });
640 return $class;
641}
642
643sub make_immutable {
644 my $self = shift;
645 $self->SUPER::make_immutable
646 (
e606ae5f 647 constructor_class => $self->constructor_class,
648 destructor_class => $self->destructor_class,
ac2dc464 649 inline_destructor => 1,
650 # NOTE:
651 # no need to do this,
652 # Moose always does it
653 inline_accessors => 0,
654 @_,
655 );
5cf3dbcf 656}
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
fcab1742 682 my %args = ( metaclass => $self, last_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
a810a01f 688 Class::MOP::load_class($class);
689
11c86f15 690 $class->new(
bf6fa6b3 691 Carp::caller_info($args{depth}),
692 %args
11c86f15 693 );
694}
695
c0e30cf5 6961;
697
698__END__
699
700=pod
701
702=head1 NAME
703
e522431d 704Moose::Meta::Class - The Moose metaclass
c0e30cf5 705
c0e30cf5 706=head1 DESCRIPTION
707
ac2dc464 708This is a subclass of L<Class::MOP::Class> with Moose specific
e522431d 709extensions.
710
ac2dc464 711For the most part, the only time you will ever encounter an
712instance of this class is if you are doing some serious deep
713introspection. To really understand this class, you need to refer
6ba6d68c 714to the L<Class::MOP::Class> documentation.
715
c0e30cf5 716=head1 METHODS
717
718=over 4
719
590868a3 720=item B<initialize>
721
61bdd94f 722=item B<create>
723
17594769 724Overrides original to accept a list of roles to apply to
61bdd94f 725the created class.
726
17594769 727 my $metaclass = Moose::Meta::Class->create( 'New::Class', roles => [...] );
728
729=item B<create_anon_class>
730
731Overrides original to support roles and caching.
732
733 my $metaclass = Moose::Meta::Class->create_anon_class(
734 superclasses => ['Foo'],
735 roles => [qw/Some Roles Go Here/],
736 cache => 1,
737 );
738
5cf3dbcf 739=item B<make_immutable>
740
ac2dc464 741Override original to add default options for inlining destructor
742and altering the Constructor metaclass.
743
744=item B<create_immutable_transformer>
745
746Override original to lock C<add_role> and memoize C<calculate_all_roles>
747
8c9d74e7 748=item B<new_object>
749
02a0fb52 750We override this method to support the C<trigger> attribute option.
751
a15dff8d 752=item B<construct_instance>
753
ac2dc464 754This provides some Moose specific extensions to this method, you
755almost never call this method directly unless you really know what
756you are doing.
6ba6d68c 757
758This method makes sure to handle the moose weak-ref, type-constraint
ac2dc464 759and type coercion features.
ef1d5f4b 760
093b12c2 761=item B<get_method_map>
e9ec68d6 762
ac2dc464 763This accommodates Moose::Meta::Role::Method instances, which are
764aliased, instead of added, but still need to be counted as valid
e9ec68d6 765methods.
766
78cd1d3b 767=item B<add_override_method_modifier ($name, $method)>
768
ac2dc464 769This will create an C<override> method modifier for you, and install
02a0fb52 770it in the package.
771
78cd1d3b 772=item B<add_augment_method_modifier ($name, $method)>
773
ac2dc464 774This will create an C<augment> method modifier for you, and install
02a0fb52 775it in the package.
776
2b14ac61 777=item B<calculate_all_roles>
778
ef333f17 779=item B<roles>
780
ac2dc464 781This will return an array of C<Moose::Meta::Role> instances which are
02a0fb52 782attached to this class.
783
ef333f17 784=item B<add_role ($role)>
785
ac2dc464 786This takes an instance of C<Moose::Meta::Role> in C<$role>, and adds it
02a0fb52 787to the list of associated roles.
788
ef333f17 789=item B<does_role ($role_name)>
790
ac2dc464 791This will test if this class C<does> a given C<$role_name>. It will
792not only check it's local roles, but ask them as well in order to
02a0fb52 793cascade down the role hierarchy.
794
d79e62fd 795=item B<excludes_role ($role_name)>
796
ac2dc464 797This will test if this class C<excludes> a given C<$role_name>. It will
798not only check it's local roles, but ask them as well in order to
d79e62fd 799cascade down the role hierarchy.
800
9e93dd19 801=item B<add_attribute ($attr_name, %params|$params)>
4e848edb 802
9e93dd19 803This method does the same thing as L<Class::MOP::Class::add_attribute>, but adds
804support for taking the C<$params> as a HASH ref.
ac1ef2f9 805
e606ae5f 806=item B<constructor_class ($class_name)>
807
808=item B<destructor_class ($class_name)>
809
810These are the names of classes used when making a class
811immutable. These default to L<Moose::Meta::Method::Constructor> and
812L<Moose::Meta::Method::Destructor> respectively. These accessors are
813read-write, so you can use them to change the class name.
814
8b1d510f 815=item B<error_class ($class_name)>
816
817The name of the class used to throw errors. This default to
818L<Moose::Error::Default>, which generates an error with a stacktrace
819just like C<Carp::confess>.
820
4fb87686 821=item B<check_metaclass_compatibility>
822
823Moose overrides this method from C<Class::MOP::Class> and attempts to
824fix some incompatibilities before doing the check.
825
11c86f15 826=item B<throw_error $message, %extra>
827
828Throws the error created by C<create_error> using C<raise_error>
829
830=item B<create_error $message, %extra>
831
832Creates an error message or object.
833
834The default behavior is C<create_error_confess>.
835
836If C<error_class> is set uses C<create_error_object>. Otherwise uses
837C<error_builder> (a code reference or variant name), and calls the appropriate
838C<create_error_$builder> method.
839
840=item B<error_builder $builder_name>
841
842Get or set the error builder. Defaults to C<confess>.
843
844=item B<error_class $class_name>
845
846Get or set the error class. Has no default.
847
848=item B<create_error_confess %args>
849
850Creates an error using L<Carp/longmess>
851
852=item B<create_error_croak %args>
853
854Creates an error using L<Carp/shortmess>
855
856=item B<create_error_object %args>
857
858Calls C<new> on the C<class> parameter in C<%args>. Usable with C<error_class>
859to support custom error objects for your meta class.
860
861=item B<raise_error $error>
862
863Dies with an error object or string.
864
c0e30cf5 865=back
866
867=head1 BUGS
868
ac2dc464 869All complex software has bugs lurking in it, and this module is no
c0e30cf5 870exception. If you find a bug please either email me, or add the bug
871to cpan-RT.
872
c0e30cf5 873=head1 AUTHOR
874
875Stevan Little E<lt>stevan@iinteractive.comE<gt>
876
877=head1 COPYRIGHT AND LICENSE
878
778db3ac 879Copyright 2006-2008 by Infinity Interactive, Inc.
c0e30cf5 880
881L<http://www.iinteractive.com>
882
883This library is free software; you can redistribute it and/or modify
ac2dc464 884it under the same terms as Perl itself.
c0e30cf5 885
8a7a9c53 886=cut
1a563243 887