in reply to Delayed-write object/module

Using a ramfile (or maybe IO::String for pre-5.8) for your buffering saves a lot of complication. This only requires two methods and 10 lines of code:

#! perl -sw package IO::Delayed; sub new { my $class = shift; ## Create an anonymous glob my $self = do{ local *GLOB; \*GLOB }; ## Use it to hold both the both the filehandle ## and a ramfile open *$self, '>', \${ *$self } or die $!; ## bless and return it return bless $self, $class; } sub setPath { my( $self, $path ) = @_; ## Re-use the glob for the real file open $self, '>', $path or die $!; ## Output the buffered data print $self ${ *$self }; ## Free up the storage undef ${ *$self }; return; } return 1 if caller; package main; my $log = IO::Delayed->new; ## create a rambuffered filehandle print $log "$_\n" for 1 .. 10; ## log some stuff to it $log->setPath( 'mylog.out' ); ## Now redirect it to disk print $log "$_\n" for 100 .. 110; ## and it becomes a normal filehandl +e __END__ C:\test>junk4 C:\test>type mylog.out 1 2 3 4 5 6 7 8 9 10 100 101 102 103 104 105 106 107 108 109 110

Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
Lingua non convalesco, consenesco et abolesco. -- Rule 1 has a caveat! -- Who broke the cabal?
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.