AnyEvent-Promises

 view release on metacpan or  search on metacpan

lib/AnyEvent/Promises/Deferred.pm  view on Meta::CPAN

    return wantarray? @res: $res[0];
}

# can be used with AnyEvent < 6 having no postpone 
my $postpone;
if (defined &AE::postpone){
    $postpone = \&AE::postpone;
}
else {
    my $POSTPONE_W;
    my @POSTPONE;

    my $postpone_exec = sub {
        undef $POSTPONE_W;

        &{ shift @POSTPONE } while @POSTPONE;
    };

    $postpone = sub {
        push @POSTPONE, shift;
        $POSTPONE_W ||= AE::timer( 0, 0, $postpone_exec );
        ();
    };
};

sub _do_then {
    my ( $this, $d, $on_fulfill, $on_reject ) = @_;

    my $rejected = $this->{state} == 2;
    my ( $value, $reason ) = @$this{qw(value reason)};
    if ( my $f = $rejected ? $on_reject : $on_fulfill ) {
        $postpone->(sub {
            my @values = eval { $f->( $rejected ? $reason : @$value ) };
            if ( my $err = $@ ) {
                $d->reject($err);
            }
            elsif (@values == 1
                && blessed( $values[0] )
                && $values[0]->can('then') )
            {
                $values[0]->then(
                    sub { $d->resolve(@_); return; },
                    sub { $d->reject(@_);  return; }
                );
            }
            else {
                $d->resolve(@values);
            }
        });
    }
    elsif ($rejected) {
        $d->reject($reason);
    }
    else {
        $d->resolve(@$value);
    }
}

1;

# vim: expandtab:shiftwidth=4:tabstop=4:softtabstop=0:textwidth=78:

__END__

=pod

=head1 NAME

AnyEvent::Promises::Deferred - deferred and promises objects

=head1 VERSION

version 0.06

=head1 DESCRIPTION

No user servicable parts here. See L<AnyEvent::Promises> for documentation.

=head1 AUTHOR

Roman Daniel <roman.daniel@davosro.cz>

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2014 by Roman Daniel.

This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.

=cut



( run in 0.392 second using v1.01-cache-2.11-cpan-5b529ec07f3 )