package My::Hash; use base 'Tie::Hash'; our %hash = ('dir' => '/home/foo'); sub TIEHASH { return bless \%hash, __PACKAGE__; } sub STORE { my ($self, $key, $val) = @_; $self->{$key} = $val; } sub FETCH { my ($self, $key) = @_; my $val = $self->{$key}; tie my $tied_scalar, 'My::Scalar', $key, $val; return $tied_scalar; } 1; package My::Scalar; use base 'Tie::Scalar'; sub TIESCALAR { my ($self, $key, $val) = @_; return bless {'value' => $val, 'key' => $key , 'fetched' => 0 }, __PACKAGE__; } sub STORE { my $self = shift; my $newval = shift; my $key = $self->{'key'}; My::Hash::hash{$key} = $self->{'value'} = $newval; } sub FETCH { my $self = shift; # this cleverness is done so that Tie::Hash FETCH does not # call Tie::Scalar FETCH when it tries to return the tied # scalar. if ($self->{'fetched'}) { return $self->{'value'}; }else{ $self->{'fetched'} = 1; return $self; } } 1;