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