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