{
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;
{
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;