more consting
[p5sagit/p5-mst-13.2.git] / lib / overload.pm
index 1ca22b4..c02fddb 100644 (file)
@@ -1,6 +1,6 @@
 package overload;
 
-our $VERSION = '1.04';
+our $VERSION = '1.06';
 
 sub nil {}
 
@@ -72,7 +72,13 @@ sub OverloadedStringify {
 
 sub Method {
   my $package = shift;
-  $package = ref $package if ref $package;
+  if(ref $package) {
+    local $@;
+    local $!;
+    require Scalar::Util;
+    $package = Scalar::Util::blessed($package);
+    return undef if !defined $package;
+  }
   #my $meth = $package->can('(' . shift);
   ov_method mycan($package, '(' . shift), $package;
   #return $meth if $meth ne \&nil;
@@ -83,24 +89,27 @@ sub AddrRef {
   my $package = ref $_[0];
   return "$_[0]" unless $package;
 
-       require Scalar::Util;
-       my $class = Scalar::Util::blessed($_[0]);
-       my $class_prefix = defined($class) ? "$class=" : "";
-       my $type = Scalar::Util::reftype($_[0]);
-       my $addr = Scalar::Util::refaddr($_[0]);
-       return sprintf("$class_prefix$type(0x%x)", $addr);
+  local $@;
+  local $!;
+  require Scalar::Util;
+  my $class = Scalar::Util::blessed($_[0]);
+  my $class_prefix = defined($class) ? "$class=" : "";
+  my $type = Scalar::Util::reftype($_[0]);
+  my $addr = Scalar::Util::refaddr($_[0]);
+  return sprintf("$class_prefix$type(0x%x)", $addr);
 }
 
 *StrVal = *AddrRef;
 
 sub mycan {                            # Real can would leave stubs.
   my ($package, $meth) = @_;
-  return \*{$package . "::$meth"} if defined &{$package . "::$meth"};
-  my $p;
-  foreach $p (@{$package . "::ISA"}) {
-    my $out = mycan($p, $meth);
-    return $out if $out;
+
+  my $mro = mro::get_linear_isa($package);
+  foreach my $p (@$mro) {
+    my $fqmeth = $p . q{::} . $meth;
+    return \*{$fqmeth} if defined &{$fqmeth};
   }
+
   return undef;
 }