# You may distribute under the terms of either the GNU General Public License # or the Artistic License (the same terms as Perl itself) # # (C) Paul Evans, 2013-2024 -- leonerd@leonerd.org.uk package IO::Async::Future 0.803; use v5.14; use warnings; use base qw( Future ); Future->VERSION( '0.05' ); # to respect subclassing # Newer versions of Future have a proper subclassing-data API; for older # versions we just treat it as a hashref use constant FUTURE_HAS_UDATA => defined Future->can( "udata" ); use Carp; =head1 NAME C - use L with L =head1 SYNOPSIS use Future::AsyncAwait; use IO::Async::Loop; my $loop = IO::Async::Loop->new; my $future = $loop->new_future; $loop->watch_time( after => 3, code => sub { $future->done( "Done" ) } ); print await( $future ), "\n"; =head1 DESCRIPTION This subclass of L stores a reference to the L instance that created it, allowing the C method to block until the Future is ready. These objects should not be constructed directly; instead the C method on the containing Loop should be used. For a full description on how to use Futures, see the L documentation. =cut =head1 CONSTRUCTORS New C objects should be constructed by using the following methods on the C. For more detail see the L documentation. $future = $loop->new_future; Returns a new pending Future. $future = $loop->delay_future( %args ); Returns a new Future that will become done at a given time. $future = $loop->timeout_future( %args ); Returns a new Future that will become failed at a given time. =cut sub new { my $proto = shift; my $self = $proto->SUPER::new; my $loop; if( ref $proto ) { $loop = $proto->loop; } else { $loop = shift; } if( FUTURE_HAS_UDATA ) { $self->set_udata( loop => $loop ); } else { $self->{loop} = $loop; } return $self; } =head1 METHODS =cut =head2 loop $loop = $future->loop; Returns the underlying L object. =cut sub loop { my $self = shift; return FUTURE_HAS_UDATA ? $self->udata( "loop" ) : $self->{loop}; } sub await { my $self = shift; $self->loop->await( $self ); } =head2 done_later $future->done_later( @result ); A shortcut to calling the C method in a C idle watch on the underlying Loop object. Ensures that a returned Future object is not ready immediately, but will wait for the next IO round. Like C, returns C<$future> itself to allow easy chaining. =cut sub done_later { my $self = shift; my @result = @_; $self->loop->later( sub { $self->done( @result ) } ); return $self; } =head2 fail_later $future->fail_later( $exception, @details ); A shortcut to calling the C method in a C idle watch on the underlying Loop object. Ensures that a returned Future object is not ready immediately, but will wait for the next IO round. Like C, returns C<$future> itself to allow easy chaining. =cut sub fail_later { my $self = shift; my ( $exception, @details ) = @_; $exception or croak "Expected a true exception"; $self->loop->later( sub { $self->fail( $exception, @details ) } ); return $self; } =head1 AUTHOR Paul Evans =cut 0x55AA;