f74b483336e03bf60174e5b39b052f87e94e4742
[gitmo/Moose.git] / lib / Moose / Meta / Class.pm
1
2 package Moose::Meta::Class;
3
4 use strict;
5 use warnings;
6
7 use Class::MOP;
8
9 use Carp ();
10 use List::Util qw( first );
11 use List::MoreUtils qw( any all uniq first_index );
12 use Scalar::Util 'weaken', 'blessed';
13
14 our $VERSION   = '0.89_02';
15 $VERSION = eval $VERSION;
16 our $AUTHORITY = 'cpan:STEVAN';
17
18 use Moose::Meta::Method::Overridden;
19 use Moose::Meta::Method::Augmented;
20 use Moose::Error::Default;
21 use Moose::Meta::Class::Immutable::Trait;
22 use Moose::Meta::Method::Constructor;
23 use Moose::Meta::Method::Destructor;
24
25 use base 'Class::MOP::Class';
26
27 __PACKAGE__->meta->add_attribute('roles' => (
28     reader  => 'roles',
29     default => sub { [] }
30 ));
31
32 __PACKAGE__->meta->add_attribute('role_applications' => (
33     reader  => '_get_role_applications',
34     default => sub { [] }
35 ));
36
37 __PACKAGE__->meta->add_attribute(
38     Class::MOP::Attribute->new('immutable_trait' => (
39         accessor => "immutable_trait",
40         default  => 'Moose::Meta::Class::Immutable::Trait',
41     ))
42 );
43
44 __PACKAGE__->meta->add_attribute('constructor_class' => (
45     accessor => 'constructor_class',
46     default  => 'Moose::Meta::Method::Constructor',
47 ));
48
49 __PACKAGE__->meta->add_attribute('destructor_class' => (
50     accessor => 'destructor_class',
51     default  => 'Moose::Meta::Method::Destructor',
52 ));
53
54 __PACKAGE__->meta->add_attribute('error_class' => (
55     accessor => 'error_class',
56     default  => 'Moose::Error::Default',
57 ));
58
59 sub initialize {
60     my $class = shift;
61     my $pkg   = shift;
62     return Class::MOP::get_metaclass_by_name($pkg)
63         || $class->SUPER::initialize($pkg,
64                 'attribute_metaclass' => 'Moose::Meta::Attribute',
65                 'method_metaclass'    => 'Moose::Meta::Method',
66                 'instance_metaclass'  => 'Moose::Meta::Instance',
67                 @_
68             );
69 }
70
71 sub _immutable_options {
72     my ( $self, @args ) = @_;
73
74     $self->SUPER::_immutable_options(
75         inline_destructor => 1,
76
77         # Moose always does this when an attribute is created
78         inline_accessors => 0,
79
80         @args,
81     );
82 }
83
84 sub create {
85     my ($self, $package_name, %options) = @_;
86
87     (ref $options{roles} eq 'ARRAY')
88         || $self->throw_error("You must pass an ARRAY ref of roles", data => $options{roles})
89             if exists $options{roles};
90     my $roles = delete $options{roles};
91
92     my $class = $self->SUPER::create($package_name, %options);
93
94     if ($roles) {
95         Moose::Util::apply_all_roles( $class, @$roles );
96     }
97
98     return $class;
99 }
100
101 sub _check_metaclass_compatibility {
102     my $self = shift;
103
104     if ( my @supers = $self->superclasses ) {
105         $self->_fix_metaclass_incompatibility(@supers);
106     }
107
108     $self->SUPER::_check_metaclass_compatibility(@_);
109 }
110
111 my %ANON_CLASSES;
112
113 sub create_anon_class {
114     my ($self, %options) = @_;
115
116     my $cache_ok = delete $options{cache};
117
118     # something like Super::Class|Super::Class::2=Role|Role::1
119     my $cache_key = join '=' => (
120         join('|', @{$options{superclasses} || []}),
121         join('|', sort @{$options{roles}   || []}),
122     );
123
124     if ($cache_ok && defined $ANON_CLASSES{$cache_key}) {
125         return $ANON_CLASSES{$cache_key};
126     }
127
128     my $new_class = $self->SUPER::create_anon_class(%options);
129
130     $ANON_CLASSES{$cache_key} = $new_class
131         if $cache_ok;
132
133     return $new_class;
134 }
135
136 sub add_role {
137     my ($self, $role) = @_;
138     (blessed($role) && $role->isa('Moose::Meta::Role'))
139         || $self->throw_error("Roles must be instances of Moose::Meta::Role", data => $role);
140     push @{$self->roles} => $role;
141 }
142
143 sub make_immutable {
144     my $self = shift;
145
146     # we do this for metaclasses way too often to do this check for them
147     if ( !$self->name->isa('Class::MOP::Object') ) {
148         my @superclasses = grep { $_ ne 'Moose::Object' && $_ ne $self->name }
149             $self->linearized_isa;
150
151         for my $superclass (@superclasses) {
152             my $meta = Class::MOP::class_of($superclass);
153
154             next unless $meta && $meta->isa('Moose::Meta::Class');
155             next unless $meta->is_mutable;
156             # This can happen when a base class role is applied via
157             # Moose::Util::MetaRole::apply_base_class_roles. The parent is an
158             # anon class and is still mutable, but that's okay.
159             next if $meta->is_anon_class;
160
161             Carp::cluck( "Calling make_immutable on "
162                     . $self->name
163                     . ", which has a mutable ancestor ($superclass)" );
164             last;
165         }
166     }
167
168     $self->SUPER::make_immutable(@_);
169 }
170
171 sub role_applications {
172     my ($self) = @_;
173
174     return @{$self->_get_role_applications};
175 }
176
177 sub add_role_application {
178     my ($self, $application) = @_;
179     (blessed($application) && $application->isa('Moose::Meta::Role::Application::ToClass'))
180         || $self->throw_error("Role applications must be instances of Moose::Meta::Role::Application::ToClass", data => $application);
181     push @{$self->_get_role_applications} => $application;
182 }
183
184 sub calculate_all_roles {
185     my $self = shift;
186     my %seen;
187     grep { !$seen{$_->name}++ } map { $_->calculate_all_roles } @{ $self->roles };
188 }
189
190 sub does_role {
191     my ($self, $role_name) = @_;
192
193     (defined $role_name)
194         || $self->throw_error("You must supply a role name to look for");
195
196     foreach my $class ($self->class_precedence_list) {
197         my $meta = Class::MOP::class_of($class);
198         # when a Moose metaclass is itself extended with a role,
199         # this check needs to be done since some items in the
200         # class_precedence_list might in fact be Class::MOP
201         # based still.
202         next unless $meta && $meta->can('roles');
203         foreach my $role (@{$meta->roles}) {
204             return 1 if $role->does_role($role_name);
205         }
206     }
207     return 0;
208 }
209
210 sub excludes_role {
211     my ($self, $role_name) = @_;
212
213     (defined $role_name)
214         || $self->throw_error("You must supply a role name to look for");
215
216     foreach my $class ($self->class_precedence_list) {
217         my $meta = Class::MOP::class_of($class);
218         # when a Moose metaclass is itself extended with a role,
219         # this check needs to be done since some items in the
220         # class_precedence_list might in fact be Class::MOP
221         # based still.
222         next unless $meta && $meta->can('roles');
223         foreach my $role (@{$meta->roles}) {
224             return 1 if $role->excludes_role($role_name);
225         }
226     }
227     return 0;
228 }
229
230 sub new_object {
231     my $class  = shift;
232     my $params = @_ == 1 ? $_[0] : {@_};
233     my $self   = $class->SUPER::new_object($params);
234
235     foreach my $attr ( $class->get_all_attributes() ) {
236
237         next unless $attr->can('has_trigger') && $attr->has_trigger;
238
239         my $init_arg = $attr->init_arg;
240
241         next unless defined $init_arg;
242
243         next unless exists $params->{$init_arg};
244
245         $attr->trigger->(
246             $self,
247             (
248                   $attr->should_coerce
249                 ? $attr->get_read_method_ref->($self)
250                 : $params->{$init_arg}
251             ),
252         );
253     }
254
255     return $self;
256 }
257
258 sub superclasses {
259     my $self = shift;
260     my @supers = @_;
261     foreach my $super (@supers) {
262         Class::MOP::load_class($super);
263         my $meta = Class::MOP::class_of($super);
264         $self->throw_error("You cannot inherit from a Moose Role ($super)")
265             if $meta && $meta->isa('Moose::Meta::Role')
266     }
267     return $self->SUPER::superclasses(@supers);
268 }
269
270 ### ---------------------------------------------
271
272 sub add_attribute {
273     my $self = shift;
274     my $attr =
275         (blessed $_[0] && $_[0]->isa('Class::MOP::Attribute')
276             ? $_[0]
277             : $self->_process_attribute(@_));
278     $self->SUPER::add_attribute($attr);
279     # it may be a Class::MOP::Attribute, theoretically, which doesn't have
280     # 'bare' and doesn't implement this method
281     if ($attr->can('_check_associated_methods')) {
282         $attr->_check_associated_methods;
283     }
284     return $attr;
285 }
286
287 sub add_override_method_modifier {
288     my ($self, $name, $method, $_super_package) = @_;
289
290     (!$self->has_method($name))
291         || $self->throw_error("Cannot add an override method if a local method is already present");
292
293     $self->add_method($name => Moose::Meta::Method::Overridden->new(
294         method  => $method,
295         class   => $self,
296         package => $_super_package, # need this for roles
297         name    => $name,
298     ));
299 }
300
301 sub add_augment_method_modifier {
302     my ($self, $name, $method) = @_;
303     (!$self->has_method($name))
304         || $self->throw_error("Cannot add an augment method if a local method is already present");
305
306     $self->add_method($name => Moose::Meta::Method::Augmented->new(
307         method  => $method,
308         class   => $self,
309         name    => $name,
310     ));
311 }
312
313 ## Private Utility methods ...
314
315 sub _find_next_method_by_name_which_is_not_overridden {
316     my ($self, $name) = @_;
317     foreach my $method ($self->find_all_methods_by_name($name)) {
318         return $method->{code}
319             if blessed($method->{code}) && !$method->{code}->isa('Moose::Meta::Method::Overridden');
320     }
321     return undef;
322 }
323
324 sub _fix_metaclass_incompatibility {
325     my ($self, @superclasses) = @_;
326
327     foreach my $super (@superclasses) {
328         my $meta = Class::MOP::Class->initialize($super);
329
330         my @all_supers = $meta->linearized_isa;
331         shift @all_supers;
332
333         my @super_metas_to_fix = ($meta);
334
335         # We need to check & fix the immediate superclass. If its @ISA
336         # contains a class without a metaclass instance, followed by a
337         # class _with_ a metaclass instance, init a metaclass instance
338         # for classes without one and fix compat up to and including
339         # the class which was already initialized.
340         my $idx = first_index { Class::MOP::class_of($_) } @all_supers;
341
342         push @super_metas_to_fix,
343             map { Class::MOP::Class->initialize($_) } @all_supers[ 0 .. $idx ]
344             if $idx >= 0;
345
346         foreach my $super_meta (@super_metas_to_fix) {
347             $self->_fix_one_incompatible_metaclass($super_meta);
348         }
349     }
350 }
351
352 sub _fix_one_incompatible_metaclass {
353     my ($self, $meta) = @_;
354
355     return if $self->_superclass_meta_is_compatible($meta);
356
357     unless ( $self->is_pristine ) {
358         $self->throw_error(
359               "Cannot attempt to reinitialize metaclass for "
360             . $self->name
361             . ", it isn't pristine" );
362     }
363
364     $self->_reconcile_with_superclass_meta($meta);
365 }
366
367 sub _superclass_meta_is_compatible {
368     my ($self, $super_meta) = @_;
369
370     next unless $super_meta->isa("Class::MOP::Class");
371
372     my $super_meta_name
373         = $super_meta->is_immutable
374         ? $super_meta->_get_mutable_metaclass_name
375         : ref($super_meta);
376
377     return 1
378         if $self->isa($super_meta_name)
379             and
380            $self->instance_metaclass->isa( $super_meta->instance_metaclass );
381 }
382
383 # I don't want to have to type this >1 time
384 my @MetaClassTypes =
385     qw( attribute_metaclass
386         method_metaclass
387         wrapped_method_metaclass
388         instance_metaclass
389         constructor_class
390         destructor_class
391         error_class );
392
393 sub _reconcile_with_superclass_meta {
394     my ($self, $super_meta) = @_;
395
396     my $super_meta_name
397         = $super_meta->is_immutable
398         ? $super_meta->_get_mutable_metaclass_name
399         : ref($super_meta);
400
401     my $self_metaclass = ref $self;
402
403     # If neither of these is true we have a more serious
404     # incompatibility that we just cannot fix (yet?).
405     if ( $super_meta_name->isa( ref $self )
406         && all { $super_meta->$_->isa( $self->$_ ) } @MetaClassTypes ) {
407         $self->_reinitialize_with($super_meta);
408     }
409     elsif ( $self->_all_metaclasses_differ_by_roles_only($super_meta) ) {
410         $self->_reconcile_role_differences($super_meta);
411     }
412 }
413
414 sub _reinitialize_with {
415     my ( $self, $new_meta ) = @_;
416
417     my $new_self = $new_meta->reinitialize(
418         $self->name,
419         attribute_metaclass => $new_meta->attribute_metaclass,
420         method_metaclass    => $new_meta->method_metaclass,
421         instance_metaclass  => $new_meta->instance_metaclass,
422     );
423
424     $new_self->$_( $new_meta->$_ )
425         for qw( constructor_class destructor_class error_class );
426
427     %$self = %$new_self;
428
429     bless $self, ref $new_self;
430
431     # We need to replace the cached metaclass instance or else when it
432     # goes out of scope Class::MOP::Class destroy's the namespace for
433     # the metaclass's class, causing much havoc.
434     Class::MOP::store_metaclass_by_name( $self->name, $self );
435     Class::MOP::weaken_metaclass( $self->name ) if $self->is_anon_class;
436 }
437
438 # In the more complex case, we share a common ancestor with our
439 # superclass's metaclass, but each metaclass (ours and the parent's)
440 # has a different set of roles applied. We reconcile this by first
441 # reinitializing into the parent class, and _then_ applying our own
442 # roles.
443 sub _all_metaclasses_differ_by_roles_only {
444     my ($self, $super_meta) = @_;
445
446     for my $pair (
447         [ ref $self, ref $super_meta ],
448         map { [ $self->$_, $super_meta->$_ ] } @MetaClassTypes
449         ) {
450
451         next if $pair->[0] eq $pair->[1];
452
453         my $self_meta_meta  = Class::MOP::Class->initialize( $pair->[0] );
454         my $super_meta_meta = Class::MOP::Class->initialize( $pair->[1] );
455
456         my $common_ancestor
457             = _find_common_ancestor( $self_meta_meta, $super_meta_meta );
458
459         return unless $common_ancestor;
460
461         return
462             unless _is_role_only_subclass_of(
463             $self_meta_meta,
464             $common_ancestor,
465             )
466             && _is_role_only_subclass_of(
467             $super_meta_meta,
468             $common_ancestor,
469             );
470     }
471
472     return 1;
473 }
474
475 # This, and some other functions, could be called as methods, but
476 # they're not for two reasons. One, we just end up ignoring the first
477 # argument, because we can't call these directly on one of the real
478 # arguments, because one of them could be a Class::MOP::Class object
479 # and not a Moose::Meta::Class. Second, only a completely insane
480 # person would attempt to subclass this stuff!
481 sub _find_common_ancestor {
482     my ($meta1, $meta2) = @_;
483
484     # FIXME? This doesn't account for multiple inheritance (not sure
485     # if it needs to though). For example, is somewhere in $meta1's
486     # history it inherits from both ClassA and ClassB, and $meta2
487     # inherits from ClassB & ClassA, does it matter? And what crazy
488     # fool would do that anyway?
489
490     my %meta1_parents = map { $_ => 1 } $meta1->linearized_isa;
491
492     return first { $meta1_parents{$_} } $meta2->linearized_isa;
493 }
494
495 sub _is_role_only_subclass_of {
496     my ($meta, $ancestor) = @_;
497
498     return 1 if $meta->name eq $ancestor;
499
500     my @roles = _all_roles_until( $meta, $ancestor );
501
502     my %role_packages = map { $_->name => 1 } @roles;
503
504     my $ancestor_meta = Class::MOP::Class->initialize($ancestor);
505
506     my %shared_ancestors = map { $_ => 1 } $ancestor_meta->linearized_isa;
507
508     for my $method ( $meta->get_all_methods() ) {
509         next if $method->name eq 'meta';
510         next if $method->can('associated_attribute');
511
512         next
513             if $role_packages{ $method->original_package_name }
514                 || $shared_ancestors{ $method->original_package_name };
515
516         return 0;
517     }
518
519     # FIXME - this really isn't right. Just because an attribute is
520     # defined in a role doesn't mean it isn't _also_ defined in the
521     # subclass.
522     for my $attr ( $meta->get_all_attributes ) {
523         next if $shared_ancestors{ $attr->associated_class->name };
524
525         next if any { $_->has_attribute( $attr->name ) } @roles;
526
527         return 0;
528     }
529
530     return 1;
531 }
532
533 sub _all_roles {
534     my $meta = shift;
535
536     return _all_roles_until($meta);
537 }
538
539 sub _all_roles_until {
540     my ($meta, $stop_at_class) = @_;
541
542     return unless $meta->can('calculate_all_roles');
543
544     my @roles = $meta->calculate_all_roles;
545
546     for my $class ( $meta->linearized_isa ) {
547         last if $stop_at_class && $stop_at_class eq $class;
548
549         my $meta = Class::MOP::Class->initialize($class);
550         last unless $meta->can('calculate_all_roles');
551
552         push @roles, $meta->calculate_all_roles;
553     }
554
555     return uniq @roles;
556 }
557
558 sub _reconcile_role_differences {
559     my ($self, $super_meta) = @_;
560
561     my $self_meta = Class::MOP::class_of($self);
562
563     my %roles;
564
565     if ( my @roles = map { $_->name } _all_roles($self_meta) ) {
566         $roles{metaclass_roles} = \@roles;
567     }
568
569     for my $thing (@MetaClassTypes) {
570         my $name = $self->$thing();
571
572         my $thing_meta = Class::MOP::Class->initialize($name);
573
574         my @roles = map { $_->name } _all_roles($thing_meta)
575             or next;
576
577         $roles{ $thing . '_roles' } = \@roles;
578     }
579
580     $self->_reinitialize_with($super_meta);
581
582     Moose::Util::MetaRole::apply_metaclass_roles(
583         for_class => $self->name,
584         %roles,
585     );
586
587     return $self;
588 }
589
590 sub _process_attribute {
591     my ( $self, $name, @args ) = @_;
592
593     @args = %{$args[0]} if scalar @args == 1 && ref($args[0]) eq 'HASH';
594
595     if (($name || '') =~ /^\+(.*)/) {
596         return $self->_process_inherited_attribute($1, @args);
597     }
598     else {
599         return $self->_process_new_attribute($name, @args);
600     }
601 }
602
603 sub _process_new_attribute {
604     my ( $self, $name, @args ) = @_;
605
606     $self->attribute_metaclass->interpolate_class_and_new($name, @args);
607 }
608
609 sub _process_inherited_attribute {
610     my ($self, $attr_name, %options) = @_;
611     my $inherited_attr = $self->find_attribute_by_name($attr_name);
612     (defined $inherited_attr)
613         || $self->throw_error("Could not find an attribute by the name of '$attr_name' to inherit from in ${\$self->name}", data => $attr_name);
614     if ($inherited_attr->isa('Moose::Meta::Attribute')) {
615         return $inherited_attr->clone_and_inherit_options(%options);
616     }
617     else {
618         # NOTE:
619         # kind of a kludge to handle Class::MOP::Attributes
620         return $inherited_attr->Moose::Meta::Attribute::clone_and_inherit_options(%options);
621     }
622 }
623
624 ## -------------------------------------------------
625
626 our $error_level;
627
628 sub throw_error {
629     my ( $self, @args ) = @_;
630     local $error_level = ($error_level || 0) + 1;
631     $self->raise_error($self->create_error(@args));
632 }
633
634 sub raise_error {
635     my ( $self, @args ) = @_;
636     die @args;
637 }
638
639 sub create_error {
640     my ( $self, @args ) = @_;
641
642     require Carp::Heavy;
643
644     local $error_level = ($error_level || 0 ) + 1;
645
646     if ( @args % 2 == 1 ) {
647         unshift @args, "message";
648     }
649
650     my %args = ( metaclass => $self, last_error => $@, @args );
651
652     $args{depth} += $error_level;
653
654     my $class = ref $self ? $self->error_class : "Moose::Error::Default";
655
656     Class::MOP::load_class($class);
657
658     $class->new(
659         Carp::caller_info($args{depth}),
660         %args
661     );
662 }
663
664 1;
665
666 __END__
667
668 =pod
669
670 =head1 NAME
671
672 Moose::Meta::Class - The Moose metaclass
673
674 =head1 DESCRIPTION
675
676 This class is a subclass of L<Class::MOP::Class> that provides
677 additional Moose-specific functionality.
678
679 To really understand this class, you will need to start with the
680 L<Class::MOP::Class> documentation. This class can be understood as a
681 set of additional features on top of the basic feature provided by
682 that parent class.
683
684 =head1 INHERITANCE
685
686 C<Moose::Meta::Class> is a subclass of L<Class::MOP::Class>.
687
688 =head1 METHODS
689
690 =over 4
691
692 =item B<< Moose::Meta::Class->initialize($package_name, %options) >>
693
694 This overrides the parent's method in order to provide its own
695 defaults for the C<attribute_metaclass>, C<instance_metaclass>, and
696 C<method_metaclass> options.
697
698 These all default to the appropriate Moose class.
699
700 =item B<< Moose::Meta::Class->create($package_name, %options) >>
701
702 This overrides the parent's method in order to accept a C<roles>
703 option. This should be an array reference containing roles
704 that the class does, each optionally followed by a hashref of options
705 (C<-excludes> and C<-alias>).
706
707   my $metaclass = Moose::Meta::Class->create( 'New::Class', roles => [...] );
708
709 =item B<< Moose::Meta::Class->create_anon_class >>
710
711 This overrides the parent's method to accept a C<roles> option, just
712 as C<create> does.
713
714 It also accepts a C<cache> option. If this is true, then the anonymous
715 class will be cached based on its superclasses and roles. If an
716 existing anonymous class in the cache has the same superclasses and
717 roles, it will be reused.
718
719   my $metaclass = Moose::Meta::Class->create_anon_class(
720       superclasses => ['Foo'],
721       roles        => [qw/Some Roles Go Here/],
722       cache        => 1,
723   );
724
725 =item B<< $metaclass->make_immutable(%options) >>
726
727 This overrides the parent's method to add a few options. Specifically,
728 it uses the Moose-specific constructor and destructor classes, and
729 enables inlining the destructor.
730
731 Also, since Moose always inlines attributes, it sets the
732 C<inline_accessors> option to false.
733
734 =item B<< $metaclass->new_object(%params) >>
735
736 This overrides the parent's method in order to add support for
737 attribute triggers.
738
739 =item B<< $metaclass->add_override_method_modifier($name, $sub) >>
740
741 This adds an C<override> method modifier to the package.
742
743 =item B<< $metaclass->add_augment_method_modifier($name, $sub) >>
744
745 This adds an C<augment> method modifier to the package.
746
747 =item B<< $metaclass->calculate_all_roles >>
748
749 This will return a unique array of C<Moose::Meta::Role> instances
750 which are attached to this class.
751
752 =item B<< $metaclass->add_role($role) >>
753
754 This takes a L<Moose::Meta::Role> object, and adds it to the class's
755 list of roles. This I<does not> actually apply the role to the class.
756
757 =item B<< $metaclass->role_applications >>
758
759 Returns a list of L<Moose::Meta::Role::Application::ToClass>
760 objects, which contain the arguments to role application.
761
762 =item B<< $metaclass->add_role_application($application) >>
763
764 This takes a L<Moose::Meta::Role::Application::ToClass> object, and
765 adds it to the class's list of role applications. This I<does not>
766 actually apply any role to the class; it is only for tracking role
767 applications.
768
769 =item B<< $metaclass->does_role($role_name) >>
770
771 This returns a boolean indicating whether or not the class does the
772 specified role. This tests both the class and its parents.
773
774 =item B<< $metaclass->excludes_role($role_name) >>
775
776 A class excludes a role if it has already composed a role which
777 excludes the named role. This tests both the class and its parents.
778
779 =item B<< $metaclass->add_attribute($attr_name, %params|$params) >>
780
781 This overrides the parent's method in order to allow the parameters to
782 be provided as a hash reference.
783
784 =item B<< $metaclass->constructor_class ($class_name) >>
785
786 =item B<< $metaclass->destructor_class ($class_name) >>
787
788 These are the names of classes used when making a class
789 immutable. These default to L<Moose::Meta::Method::Constructor> and
790 L<Moose::Meta::Method::Destructor> respectively. These accessors are
791 read-write, so you can use them to change the class name.
792
793 =item B<< $metaclass->error_class($class_name) >>
794
795 The name of the class used to throw errors. This defaults to
796 L<Moose::Error::Default>, which generates an error with a stacktrace
797 just like C<Carp::confess>.
798
799 =item B<< $metaclass->throw_error($message, %extra) >>
800
801 Throws the error created by C<create_error> using C<raise_error>
802
803 =back
804
805 =head1 BUGS
806
807 All complex software has bugs lurking in it, and this module is no
808 exception. If you find a bug please either email me, or add the bug
809 to cpan-RT.
810
811 =head1 AUTHOR
812
813 Stevan Little E<lt>stevan@iinteractive.comE<gt>
814
815 =head1 COPYRIGHT AND LICENSE
816
817 Copyright 2006-2009 by Infinity Interactive, Inc.
818
819 L<http://www.iinteractive.com>
820
821 This library is free software; you can redistribute it and/or modify
822 it under the same terms as Perl itself.
823
824 =cut
825