package Weakling; use Scalar::Util qw( weaken ); sub new { die 'Call as Weakling->new(my $new_weakling)' if ( defined wantarray or scalar @_ < 2 ); my $self = {}; $self->{self} = $self; bless $self, 'Weakling'; $_[1] = $self; weaken $_[1]; return; } sub suicide { delete $_[0]->{self} } package main; use Scalar::Util qw( isweak ); use Test::More 'no_plan'; Weakling->new(my $weakling); isa_ok( $weakling, 'Weakling' ); ok( isweak $weakling, 'got a weak object' ); $weakling->suicide(); ok( ! defined $weakling, 'weakling killed itself' ); Weakling->new($weakling); isa_ok( $weakling, 'Weakling' ); ok( isweak $weakling, 'got a weak object' ); TODO: { local $TODO = "Can't overload '='"; my $w2 = $weakling; ok( isweak $w2, 'copy of weakling is weak' ); }