Try-Tiny-Retry
view release on metacpan or search on metacpan
lib/Try/Tiny/Retry.pm view on Meta::CPAN
$Carp::Internal{ +__PACKAGE__ }++;
use Try::Tiny;
BEGIN {
eval "use Sub::Name; 1" or *{subname} = sub { 1 }
}
our $_DEFAULT_DELAY = 1e5; # to override for testing
sub delay(&;@) { ## no critic
my ( $block, @rest ) = @_;
return ( bless( \$block, 'Try::Tiny::Retry::Delay' ), @rest, );
}
sub on_retry(&;@) { ## no critic
my ( $block, @rest ) = @_;
return ( bless( \$block, 'Try::Tiny::Retry::OnRetry' ), @rest, );
}
sub retry_if(&;@) { ## no critic
my ( $block, @rest ) = @_;
return ( bless( \$block, 'Try::Tiny::Retry::RetryIf' ), @rest, );
}
sub delay_exp(&;@) { ## no critic
my ( $params, @rest ) = @_;
my ( $n, $scale ) = $params->();
require Time::HiRes;
return delay {
return if $_[0] >= $n;
Time::HiRes::usleep( int rand( $scale * ( 1 << ( $_[0] - 1 ) ) ) );
}, @rest;
}
sub retry(&;@) { ## no critic
my ( $try, @code_refs ) = @_;
# name the block if we have Sub::Name
my $caller = caller;
subname( "${caller}::retry {...} " => $try );
# we need to save this here to ensure retry block is evaluated correctly
my $wantarray = wantarray;
# find labeled blocks in the argument list: retry_if and delay tag by blessing
( run in 0.636 second using v1.01-cache-2.11-cpan-49f99fa48dc )