X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FClass%2FMOP%2FClass.pm;h=52cd74ce15b2bfe17a2f4c110f227ea8efbd9f83;hb=78f6e9c6a73ff3dd985a1cebaafd0b81e543beb8;hp=f4c8a4e8634389b78f6f40885b32014ff0604af5;hpb=b7e0449689a12fc26b602e0880078a99e56aaa8d;p=gitmo%2FClass-MOP.git diff --git a/lib/Class/MOP/Class.pm b/lib/Class/MOP/Class.pm index f4c8a4e..52cd74c 100644 --- a/lib/Class/MOP/Class.pm +++ b/lib/Class/MOP/Class.pm @@ -8,7 +8,6 @@ use Class::MOP::Instance; use Class::MOP::Method::Wrapped; use Class::MOP::Method::Accessor; use Class::MOP::Method::Constructor; -use Class::MOP::Class::Immutable::Class::MOP::Class; use Carp 'confess'; use Scalar::Util 'blessed', 'weaken'; @@ -181,6 +180,8 @@ sub _check_metaclass_compatibility { return if ref($self) eq 'Class::MOP::Class' && $self->instance_metaclass eq 'Class::MOP::Instance'; + return if $self->can('get_mutable_metaclass_name'); + my @class_list = $self->linearized_isa; shift @class_list; # shift off $self->name @@ -197,17 +198,17 @@ sub _check_metaclass_compatibility { : ref($super_meta); ($self->isa($super_meta_type)) - || confess "Class::MOP::class_of(" . $self->name . ") => (" + || confess "The metaclass of " . $self->name . " (" . (ref($self)) . ")" . " is not compatible with the " . - "Class::MOP::class_of(".$superclass_name . ") => (" + "metaclass of its superclass, ".$superclass_name . " (" . ($super_meta_type) . ")"; # NOTE: # we also need to check that instance metaclasses # are compatibile in the same the class. ($self->instance_metaclass->isa($super_meta->instance_metaclass)) - || confess "Class::MOP::class_of(" . $self->name . ")->instance_metaclass => (" . ($self->instance_metaclass) . ")" . + || confess "The instance metaclass for " . $self->name . " (" . ($self->instance_metaclass) . ")" . " is not compatible with the " . - "Class::MOP::class_of(" . $superclass_name . ")->instance_metaclass => (" . ($super_meta->instance_metaclass) . ")"; + "instance metaclass of its superclass, " . $superclass_name . " (" . ($super_meta->instance_metaclass) . ")"; } } @@ -1094,25 +1095,27 @@ sub _immutable_metaclass { $trait, 'ForMetaClass', ref($self); } - if ( Class::MOP::is_class_loaded($class_name) ) { - if ( $class_name->isa($trait) ) { - return $class_name; + return $class_name + if Class::MOP::is_class_loaded($class_name); + + my $meta = Class::MOP::Class->create( + $class_name, + superclasses => [ ref $self ], + ); + + Class::MOP::load_class($trait); + for my $meth ( Class::MOP::Class->initialize($trait)->get_all_methods ) { + next if $meta->has_method( $meth->name ); + + if ( $meta->find_method_by_name( $meth->name ) ) { + $meta->add_around_method_modifier( $meth->name, $meth->body ); } else { - confess - "$class_name is already defined but does not inherit $trait"; + $meta->add_method( $meth->name, $meth->clone ); } } - else { - my @super = ( $trait, ref($self) ); - - my $meta = $self->initialize($class_name); - $meta->superclasses(@super); - $meta->make_immutable; - - return $class_name; - } + return $class_name; } sub _remove_inlined_code {