Interesting question.

I wonder if you could do something with weaken from Scalar::Util for this. You could have the object itself keep a strong reference to itself, and then all other references would have to be weak. Then the object could drop itself at will.

The problem is that a copy of a weak reference is not weak, so you can't just weaken yourself in the constructor and pass that out. The rest of the code would have to be disciplined enough to weaken every new object and every copy of an object's reference.

Update: I've been fooling around with this a little bit thinking that I could use overload, but it hasn't worked. The problem is that you can't really overload '=' so that the object returns a weakened reference to itself. The best I've come up with is to have a somewhat different constructor.

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' ); }

...but of course this won't work for you if you already have lots of construction in the traditional my $n = Obj->new() style.


In reply to Re: Object Suicide by kyle
in thread Object Suicide by pileofrogs

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.