Cleaned up + fixed handing of missing 'DESTROY's/'UNTIE's.
[MyWeb.git] / Hash.pm
diff --git a/Hash.pm b/Hash.pm
index 280c26b..b47bed9 100644 (file)
--- a/Hash.pm
+++ b/Hash.pm
@@ -71,9 +71,15 @@ sub pass($$@)
 {
 my($self,$funcname,@funcargs)=@_;
 
-       local $_=ref(tied(%{$self->{"parent"}}))."::".$funcname;
-       return if /^(?:Tie::StdHash)?::(?:DESTROY|UNTIE)$/;
-       tied(%{$self->{"parent"}})->$_(@funcargs);
+       local $@=undef();
+       my $parent_tied=tied(%{$self->{"parent"}});
+       my $destroy=1 if $funcname eq "DESTROY" || $funcname eq "UNTIE";
+       return if !defined($parent_tied) && $destroy;
+       my $r=eval {
+               $parent_tied->$funcname(@funcargs);
+               };
+       return $r if !$@ || ($destroy && $@=~/^Can't locate object method "$funcname" via package ".*" at /);
+       confess $@;
 }
 
 our $AUTOLOAD;