use v5.14; use strict; use warnings; package Test { sub new { my $scalar = $_[1]; bless \$scalar, shift } sub value { ${ $_[0] } = $_[1] if @_ > 1; ${ $_[0] } } } package CallerHash { sub TIEHASH { return bless \$_[1], $_[0]; } sub FETCH { my $obj = ${ +shift }; my $method = shift; return $obj->$method(); } sub STORE { my $obj = ${ +shift }; my $method = shift; $obj->$method(@_); } } my $obj = Test->new(4); tie my %objAsHash, CallerHash => $obj; say "$objAsHash{value}"; $objAsHash{value} = 42; say "$objAsHash{value}"; say $$obj;