in reply to Please review Class::WeakSingleton

Interesting - I don't know if I would still call this object a 'singleton' given this scope-based destruction, but I can understand the motivation and envision the requirements which has necessitated the development of this code.

One question however, why not inherit from Class::Singleton directly and simply weaken the reference returned - For example (untested code follows):

package Class::WeakSingleton; use Class::Singleton; use Scalar::Util (); use vars qw/ @ISA /; @ISA = qw/ Class::Singleton /; sub instance { my $class = shift; my $instance = $class->SUPER::instance( @_ ); weaken( \$instance ); return $instance; } 1; __END__

Update - Oops, my bad. Move along, nothing to see here ... :-)

 

perl -le 'print+unpack"N",pack"B32","00000000000000000000001001101100"'

Replies are listed 'Best First'.
Re: Re: Please review Class::WeakSingleton
by diotalevi (Canon) on Jun 20, 2003 at 05:15 UTC

    instance() is not documented as being available for inheritance and I didn't immediately see a way of doing that with subclassing. Not that I can't be daft at times. I think though... that your fix doesn't do the job right. The stored reference needs to be weakened, not the returned reference.

      Ahhh, excellent point ... One test which I think you should be performing however (and that with which I proved that my own code proposal did not work as intended) is the following which tests the out-of-scope destruction of your weakened reference - This is important because Class::Singleton would pass the test examples in your code, whereas only Class::WeakSingleton would pass this test.

      { my $g = wrapper->instance; $g->{'key'} = 'value'; } $h = wrapper->instance; die "Bad mojo!" if exists $h->{'key'};

       

      perl -le 'print+unpack"N",pack"B32","00000000000000000000001001101101"'

        Exactly. For the moment I just took the easy route and stole the existing test.pl. Its written up using some odd form of not-Test.pm and its ugly to behold. Yuck.