#!/usr/bin/perl -w use strict; use Data::Dumper; package tobj; use Scalar::Util qw( weaken ); use Data::Dumper; sub TIESCALAR { my $class = shift; my $parentObj = \shift; weaken($parentObj); my $self = {'parent' => $parentObj}; print "tie parent= ".$self->{'parent'}." deref ". ${$self->{'parent'}}."\n"; die " not a parentObj reference" if ! ${$self->{'parent'}}->isa('parentObj'); return bless($self, $class); } sub FETCH { my $self = shift; print "fetch of tobj\n"; print Dumper($self); #print Dumper([[caller 0], [caller 1], [caller 2]]); print "fetch parent= ".$self->{'parent'}." deref "; my $res = eval q!return ${$self->{'parent'}};!; print "eval failed" if !$res; print ((defined($res)?$res:'')." $@\n"); my $result = "tied result data"; return $result; } sub STORE { my $self = shift; } sub DESTROY { print "tobj destory\n"; } package parentObj; use Data::Dumper; sub new { my $class = shift; my $self = {'slice' => '', 'parentdata' => 'some parent data'}; bless($self, $class); tie($self->{'slice'}, 'tobj', $self); return $self; } sub DESTROY { my $self = shift; print "from parentObj's destroy parent data is '".$self->{parentdata}."'\n"; print "parentObj's destroy print slice is '".$self->{'slice'}."'\n"; } package main; my $parentObj = new parentObj; print "from main, getting parentObj's slice '".$parentObj->{'slice'}."'\n"; adxddsad();