package Net::Curl::Promiser::LoopBase;

use strict;
use warnings;

=encoding utf-8

=head1 NAME

Net::Curl::Promiser::LoopBase - Base class for event-loop-based implementations

=head1 DESCRIPTION

This subclass of L<Net::Curl::Promiser> provides abstract behaviors for
event loops. It doesn’t change the interface.

=cut

#----------------------------------------------------------------------

use parent qw( Net::Curl::Promiser );

use Net::Curl::Multi ();

#----------------------------------------------------------------------

sub new {
    my $self = shift()->SUPER::new(@_);

    my ($backend, $multi) = @{$self}{'backend', 'multi'};

    $multi->setopt(
        Net::Curl::Multi::CURLMOPT_TIMERDATA(),
        $backend,
    );

    $multi->setopt(
        Net::Curl::Multi::CURLMOPT_TIMERFUNCTION(),
        $backend->can('_CB_TIMER'),
    );

    return $self;
}

sub _SETOPT_FORBIDDEN {
    my ($self_or_class) = @_;

    return (
        $self_or_class->SUPER::_SETOPT_FORBIDDEN(),
        qw( TIMERFUNCTION  TIMERDATA ),
    );
}

1;
