my $dad= My::Parent->new( name => 'Robert' ); { my $son= My::Child->new( $dad, name => 'Bobby' ); } # No direct access to Bobby at this point. # That triggers garbage collection. # Bobby and Robert circularly reference each other. # Robert is still reachable from the outside. # Bobby does not get destroyed, because we can reach him indirectly: { my $son= $dad->GetSon(); # Got Bobby again } $dad= My::Parent->new( name => 'Walter' ); # No direct access to Robert, now. Garbage collection runs. # Robert and Bobby form a loop but both are unreferenced. # Both get destroyed.