AnyEvent-Net-Curl-Queued
view release on metacpan or search on metacpan
lib/AnyEvent/Net/Curl/Queued.pm view on Meta::CPAN
package AnyEvent::Net::Curl::Queued;
# ABSTRACT: Moo wrapper for queued downloads via Net::Curl & AnyEvent
use strict;
use utf8;
use warnings qw(all);
use AnyEvent;
use Carp qw(confess);
use Moo;
use MooX::Types::MooseLike::Base qw(
AnyOf
ArrayRef
Bool
HashRef
InstanceOf
Int
Num
Object
Str
is_Int
);
use Net::Curl::Share;
use AnyEvent::Net::Curl::Queued::Multi;
our $VERSION = '0.049'; # VERSION
has allow_dups => (is => 'ro', isa => Bool, default => sub { 0 });
has common_opts => (is => 'ro', isa => HashRef, default => sub { {} });
has http_response => (is => 'ro', isa => Bool, default => sub { 0 });
has completed => (
is => 'ro',
isa => Int,
default => sub { 0 },
writer => 'set_completed',
);
sub inc_completed {
my ($self) = @_;
return $self->set_completed($self->completed + 1);
}
has cv => (is => 'ro', isa => Object, default => sub { AE::cv }, lazy => 1, writer => 'set_cv');
has max => (
is => 'rw',
isa => Int,
coerce => sub {
confess 'At least 1 connection required'
if not is_Int($_[0])
or $_[0] < 1;
return $_[0];
},
default => sub { 4 },
);
lib/AnyEvent/Net/Curl/Queued.pm view on Meta::CPAN
sub append {
my ($self, $worker) = @_;
$self->queue_push($worker);
$self->start;
return;
}
sub prepend {
my ($self, $worker) = @_;
$self->queue_unshift($worker);
$self->start;
return;
}
## no critic (ProhibitBuiltinHomonyms)
sub wait {
my ($self) = @_;
# handle queue
$self->cv->recv;
# stop the watchdog
$self->clear_watchdog;
# reload
$self->set_cv(AE::cv);
return;
}
1;
__END__
=pod
=encoding UTF-8
=head1 NAME
AnyEvent::Net::Curl::Queued - Moo wrapper for queued downloads via Net::Curl & AnyEvent
=head1 VERSION
version 0.049
=head1 SYNOPSIS
#!/usr/bin/env perl
package CrawlApache;
use feature qw(say);
use strict;
use utf8;
use warnings qw(all);
use HTML::LinkExtor;
use Moo;
extends 'AnyEvent::Net::Curl::Queued::Easy';
after finish => sub {
my ($self, $result) = @_;
say $result . "\t" . $self->final_url;
if (
not $self->has_error
and $self->getinfo('content_type') =~ m{^text/html}
) {
my @links;
HTML::LinkExtor->new(sub {
my ($tag, %links) = @_;
push @links,
grep { $_->scheme eq 'http' and $_->host eq 'localhost' }
values %links;
}, $self->final_url)->parse(${$self->data});
for my $link (@links) {
$self->queue->prepend(sub {
CrawlApache->new($link);
});
}
}
};
1;
package main;
use strict;
use utf8;
use warnings qw(all);
use AnyEvent::Net::Curl::Queued;
my $q = AnyEvent::Net::Curl::Queued->new;
$q->append(sub {
CrawlApache->new('http://localhost/manual/')
});
$q->wait;
=head1 WARNING: GONE MOO!
This module isn't using L<Any::Moose> anymore due to the announced deprecation status of that module.
The switch to the L<Moo> is known to break modules that do C<extend 'AnyEvent::Net::Curl::Queued::Easy'> / C<extend 'YADA::Worker'>!
To keep the compatibility, make sure that you are using L<MooseX::NonMoose>:
package YourSubclassingModule;
use Moose;
use MooseX::NonMoose;
extends 'AnyEvent::Net::Curl::Queued::Easy';
...
Or L<MouseX::NonMoose>:
package YourSubclassingModule;
use Mouse;
use MouseX::NonMoose;
extends 'AnyEvent::Net::Curl::Queued::Easy';
...
Or the L<Any::Moose> equivalent:
package YourSubclassingModule;
use Any::Moose;
use Any::Moose qw(X::NonMoose);
extends 'AnyEvent::Net::Curl::Queued::Easy';
...
However, the recommended approach is to switch your subclassing module to L<Moo> altogether (you can use L<MooX::late> to smoothen the transition):
package YourSubclassingModule;
use Moo;
use MooX::late;
extends 'AnyEvent::Net::Curl::Queued::Easy';
...
=head1 DESCRIPTION
B<AnyEvent::Net::Curl::Queued> (a.k.a. L<YADA>, I<Yet Another Download Accelerator>) is an efficient and flexible batch downloader with a straight-forward interface capable of:
=over 4
=item *
create a queue;
=item *
append/prepend URLs;
( run in 1.360 second using v1.01-cache-2.11-cpan-39bf76dae61 )