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