On Tue, Apr 21, 2009 at 3:12 PM, David Nicol <davidni...@gmail.com> wrote:
> On Tue, Apr 21, 2009 at 3:11 PM, Bill Ward <b...@wards.net> wrote:
>> Something like Object::Retry maybe?  Then things can inherit from it?
>
> The proposed module sounds more like a has-a than an is-a.  Or maybe
> just a new method that would get included in the caller's namespace.
> Set the defaults at import time, then call it with a single coderef:
>
>
>  use retry MIN_SLEEP => 3, MAX_SLEEP => 10,  TIMEOUT => 120
>  my $asdf_server_connection;
>  retry sub { $asdf_server_connection = connect ( (new socket), ...)
> or die } # whatever
>
>
> the retry::retry routine would be something like
>
>   sub retry::retry($) {
>      my $start_time = time;
>      my $result;
>       for(;;){
>         eval { $result  = &$_[0]; 1 } and return $result;
>         my $E = $@;
>         $LOGGER and $LOGGER->( "$E invoked from @{[caller]}");
>         time - $start_time > $TIMEOUT and die "$E\n";
>         sleep ($MIN_SLEEP + rand ( $MAX_SLEEP - $MIN_SLEEP ))
>      }
>   }
>
> Everything in all-caps would be retry:: package variables, or scalars
> tied to a per-caller(1)[0] hash to mitigate AAAD surprises.  Or
> incorporated into the particular Retry::Object, as you are wisely
> suggesting.
>
> I've written stuff like that often enough that it would be cool to be
> able to have a standard name and API for it, too.

Well, there could be multiple things that have retry functionality, so
I would want to use object attributes rather than globals ... but
you're right, it's more has-a than is-a.

Reply via email to