use Scalar::Util "weaken"; use vars qw(%STORE); sub new { my ($class,$key) = @_; return $STORE{$key} if exists $STORE{$key} && defined $STORE{$key}; my $obj = $class->retrieve($key); weaken $obj; $STORE{$key} = $obj; return $obj; } ...