| kyle_burton ( @ 2008-06-18 09:14:00 |
Idempotency or Singleton Memoization
sub makeDoOnce {
my($sub) = @_;
my $alreadyDone = undef;
my @result = undef;
my $exception = undef;
return sub {
die $exception if $exception;
if ($alreadyDone) {return wantarray ? @result : $result[0];}
eval {
my $w = wantarray;
if (not defined $w) { $sub->(@_)}
if ($w) {@result = $sub->(@_)}
else {$result[0] = $sub->(@_)}
};
$exception = $@ if $@;
die $exception if $exception;
$alreadyDone = 1;
return wantarray ? @result : $result[0];
};
}