X-Git-Url: http://git.jankratochvil.net/?p=MyWeb.git;a=blobdiff_plain;f=Hash.pm;h=614c5d71967288c9e36636ba4cf10226bc48a95c;hp=280c26b6c14f8d01f7acf60eedc1fed303156821;hb=cd3a6f6c4bc2eb6d904f38b814be21c46d9e67b0;hpb=1c18d205aecccd477103e8c37e07f1a92f20bca6 diff --git a/Hash.pm b/Hash.pm index 280c26b..614c5d7 100644 --- a/Hash.pm +++ b/Hash.pm @@ -38,7 +38,7 @@ sub new($$;@) { my($class,$parent,@classes)=@_; - @classes=[$class,@classes] if $class ne __PACKAGE__; + @classes=[$class,@classes] if $class ne __PACKAGE__ || !@classes; for my $item (reverse @classes) { my $pkg=(!ref($item) ? $item : $item->[0]); my @args=@{$item}[1..$#$item] if ref $item; @@ -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;