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