X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FClass%2FMOP%2FObject.pm;h=02fd6e20a50319e2c8c927fd29ffd1970f858113;hb=5efa6a46982d17e1ff642e8b97673c6618fa7e6d;hp=a8f8a0c4365ba456862dc5915a7d804e0bd11e41;hpb=c6e75cb33bd9fd33d777325cdc3de6d5de614263;p=gitmo%2FClass-MOP.git diff --git a/lib/Class/MOP/Object.pm b/lib/Class/MOP/Object.pm index a8f8a0c..02fd6e2 100644 --- a/lib/Class/MOP/Object.pm +++ b/lib/Class/MOP/Object.pm @@ -4,9 +4,10 @@ package Class::MOP::Object; use strict; use warnings; +use Carp qw(confess); use Scalar::Util 'blessed'; -our $VERSION = '0.81'; +our $VERSION = '1.11'; $VERSION = eval $VERSION; our $AUTHORITY = 'cpan:STEVAN'; @@ -37,6 +38,63 @@ sub dump { Data::Dumper::Dumper $self; } +sub _real_ref_name { + my $self = shift; + return blessed($self); +} + +sub _is_compatible_with { + my $self = shift; + my ($other_name) = @_; + + return $self->isa($other_name); +} + +sub _can_be_made_compatible_with { + my $self = shift; + return !$self->_is_compatible_with(@_) + && defined($self->_get_compatible_metaclass(@_)); +} + +sub _make_compatible_with { + my $self = shift; + my ($other_name) = @_; + + my $new_metaclass = $self->_get_compatible_metaclass($other_name); + + confess "Can't make $self compatible with metaclass $other_name" + unless defined $new_metaclass; + + # can't use rebless_instance here, because it might not be an actual + # subclass in the case of, e.g. moose role reconciliation + $new_metaclass->meta->_force_rebless_instance($self) + if blessed($self) ne $new_metaclass; + + return $self; +} + +sub _get_compatible_metaclass { + my $self = shift; + my ($other_name) = @_; + + return $self->_get_compatible_metaclass_by_subclassing($other_name); +} + +sub _get_compatible_metaclass_by_subclassing { + my $self = shift; + my ($other_name) = @_; + my $meta_name = blessed($self) ? $self->_real_ref_name : $self; + + if ($meta_name->isa($other_name)) { + return $meta_name; + } + elsif ($other_name->isa($meta_name)) { + return $other_name; + } + + return; +} + 1; __END__ @@ -75,7 +133,7 @@ Stevan Little Estevan@iinteractive.comE =head1 COPYRIGHT AND LICENSE -Copyright 2006-2009 by Infinity Interactive, Inc. +Copyright 2006-2010 by Infinity Interactive, Inc. L