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