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