Merge branch 'stable'
[gitmo/Class-MOP.git] / lib / Class / MOP / Object.pm
index f4a54e0..0967266 100644 (file)
@@ -4,9 +4,10 @@ package Class::MOP::Object;
 use strict;
 use warnings;
 
+use Carp qw(confess);
 use Scalar::Util 'blessed';
 
-our $VERSION   = '0.77_01';
+our $VERSION   = '1.12';
 $VERSION = eval $VERSION;
 our $AUTHORITY = 'cpan:STEVAN';
 
@@ -18,7 +19,7 @@ sub meta {
 }
 
 sub _new {
-    shift->meta->new_object(@_);
+    Class::MOP::class_of(shift)->new_object(@_);
 }
 
 # RANT:
@@ -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__
@@ -45,50 +103,27 @@ __END__
 
 =head1 NAME 
 
-Class::MOP::Object - Object Meta Object
+Class::MOP::Object - Base class for metaclasses
 
 =head1 DESCRIPTION
 
-This class is basically a stub, it provides almost no functionality at all, 
-and really just exists to make the Class::MOP metamodel complete.
-
-                         ......
-                        :      :                  
-                        :      v
-                  +-------------------+
-            +-----| Class::MOP::Class |
-            |     +-------------------+
-            |        ^      ^       ^
-            v        :      :       :
-  +--------------------+    :      +--------------------+
-  | Class::MOP::Module |    :      | Class::MOP::Object |
-  +--------------------+    :      +--------------------+
-            |               :                ^
-            |               :                |
-            |    +---------------------+     |
-            +--->| Class::MOP::Package |-----+
-                 +---------------------+
-                 
-  legend:
-    ..(is an instance of)..>
-    --(is a subclass of)--->
-
-A deeper discussion of this model is currently beyond the scope of 
-this documenation. 
-  
+This class is a very minimal base class for metaclasses.
+
 =head1 METHODS
 
+This class provides a few methods which are useful in all metaclasses.
+
 =over 4
 
-=item B<meta>
+=item B<< Class::MOP::???->meta >>
+
+This returns a L<Class::MOP::Class> object.
 
-=item B<dump (?$max_depth)>
+=item B<< $metaobject->dump($max_depth) >>
 
-This will C<require> the L<Data::Dumper> module and then dump a 
-representation of your object. It passed the C<$max_depth> arg 
-to C<$Data::Dumper::Maxdepth>. The default C<$max_depth> is 1, 
-so it will not go crazy and print a massive bunch of stuff. 
-Adjust this as nessecary.
+This method uses L<Data::Dumper> to dump the object. You can pass an
+optional maximum depth, which will set C<$Data::Dumper::Maxdepth>. The
+default maximum depth is 1.
 
 =back
 
@@ -98,7 +133,7 @@ Stevan Little E<lt>stevan@iinteractive.comE<gt>
 
 =head1 COPYRIGHT AND LICENSE
 
-Copyright 2006-2008 by Infinity Interactive, Inc.
+Copyright 2006-2010 by Infinity Interactive, Inc.
 
 L<http://www.iinteractive.com>