AnyEvent-Retry
view release on metacpan or search on metacpan
lib/AnyEvent/Retry/Coro.pm view on Meta::CPAN
package AnyEvent::Retry::Coro;
BEGIN {
$AnyEvent::Retry::Coro::VERSION = '0.03';
}
# ABSTRACT: AnyEvent::Retry for jobs that run in separate threads
use Moose;
use Coro;
use Scalar::Util qw(weaken);
use Try::Tiny;
use true;
use namespace::autoclean;
extends 'AnyEvent::Retry';
has '+on_failure' => (
init_arg => undef,
required => 0,
writer => 'set_failure_cb',
);
has '+on_success' => (
init_arg => undef,
required => 0,
writer => 'set_success_cb',
);
has 'running_coro' => (
init_arg => undef,
accessor => 'running_coro',
clearer => 'clear_running_coro',
);
before start => sub {
my $self = shift;
Scalar::Util::weaken($self);
my $cb = Coro::rouse_cb;
$self->set_failure_cb( sub { $cb->( error => @_ ) } );
$self->set_success_cb( sub { $cb->( success => @_ ) } );
};
override run_code => sub {
my $self = shift;
my @result = try {
my $result = $self->try->();
return (($result ? 1 : 0), 'success', $result);
}
catch {
warn $_;
return (0, 'error', $_);
}
};
override handle_tick => sub {
my ($self, $i) = @_;
weaken $self;
$self->running_coro(async {
$self->handle_result($self->run_code);
$self->clear_running_coro if defined $self;
});
};
sub DEMOLISH {
my $self = shift;
$self->running_coro->throw('DEMOLISH');
}
sub wait {
my ($status, @args) = Coro::rouse_wait();
return $args[0] if $status eq 'success';
die $args[1];
}
( run in 2.799 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )