AnyEvent-Net-Curl-Queued
view release on metacpan or search on metacpan
lib/YADA.pm view on Meta::CPAN
if ($type eq q(append)) {
push @{$self->_queue} => [ $type => \%copy ];
} elsif ($type eq q(prepend)) {
unshift @{$self->_queue} => [ $type => \%copy ];
}
}
} else {
$orig->($self => @_);
}
return $self;
}
sub _shift_worker {
my ($self) = @_;
my $queue = $self->_queue;
my $max = $self->max << 2;
while (@{$queue} and ($self->count < $max)) {
my ($type, $params) = @{shift @{$queue}};
$self->$type(sub { YADA::Worker->new($params) });
}
return;
}
before wait => sub { shift->_shift_worker };
1;
__END__
=pod
=encoding UTF-8
=head1 NAME
YADA - "Yet Another Download Accelerator": alias for AnyEvent::Net::Curl::Queued
=head1 VERSION
version 0.049
=head1 SYNOPSIS
#!/usr/bin/env perl
use common::sense;
use YADA;
YADA->new->append(
[qw[
http://www.cpan.org/modules/by-category/02_Language_Extensions/
http://www.cpan.org/modules/by-category/02_Perl_Core_Modules/
http://www.cpan.org/modules/by-category/03_Development_Support/
...
http://www.cpan.org/modules/by-category/27_Pragma/
http://www.cpan.org/modules/by-category/28_Perl6/
http://www.cpan.org/modules/by-category/99_Not_In_Modulelist/
]] => sub {
say $_[0]->final_url;
say ${$_[0]->header};
},
)->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
Use L<AnyEvent::Net::Curl::Queued> with fewer keystrokes.
Also, the I<easy things should be easy> side of the package.
For the I<hard things should be possible> side, refer to the complete L<AnyEvent::Net::Curl::Queued> documentation.
=head1 USAGE
The example in L</SYNOPSIS> is equivalent to:
#!/usr/bin/env perl
use common::sense;
use AnyEvent::Net::Curl::Queued;
use AnyEvent::Net::Curl::Queued::Easy;
my $q = AnyEvent::Net::Curl::Queued->new;
$q->append(sub {
AnyEvent::Net::Curl::Queued::Easy->new({
initial_url => $_,
on_finish => sub {
say $_[0]->final_url;
say ${$_[0]->header};
},
})
}) for qw(
http://www.cpan.org/modules/by-category/02_Language_Extensions/
http://www.cpan.org/modules/by-category/02_Perl_Core_Modules/
http://www.cpan.org/modules/by-category/03_Development_Support/
...
http://www.cpan.org/modules/by-category/27_Pragma/
http://www.cpan.org/modules/by-category/28_Perl6/
http://www.cpan.org/modules/by-category/99_Not_In_Modulelist/
);
$q->wait;
As you see, L<YADA> overloads C<append>/C<prepend> from L<AnyEvent::Net::Curl::Queued>, adding implicit constructor for the worker object.
It also makes both methods return a reference to the queue object, so (almost) everything gets chainable.
The implicit constructor is triggered only when C<append>/C<prepend> receives multiple arguments.
The order of arguments (mostly) doesn't matter.
Their meaning is induced by their reference type:
=over 4
=item *
String (non-reference) or L<URI>: assumed as L<AnyEvent::Net::Curl::Queued::Easy/initial_url> attribute. Passing several URLs will construct & enqueue several workers;
=item *
Array: process a batch of URLs;
=item *
Hash: attributes set for each L<AnyEvent::Net::Curl::Queued::Easy> instantiated. Passing several hashes will merge them, overwriting values for duplicate keys;
=item *
C<sub { ... }>: assumed as L<AnyEvent::Net::Curl::Queued::Easy/on_finish> attribute;
=item *
C<sub { ... }, sub { ... }>: the first block is assumed as L<AnyEvent::Net::Curl::Queued::Easy/on_init> attribute, while the second one is assumed as L<AnyEvent::Net::Curl::Queued::Easy/on_finish>.
=back
=head2 Beware!
L<YADA> tries to follow the I<principle of least astonishment>, at least when you play nicely.
All the following snippets have the same meaning:
$q->append(
{ retry => 3 },
'http://www.cpan.org',
'http://metacpan.org',
sub { $_[0]->setopt(verbose => 1) }, # on_init placeholder
\&on_finish,
);
$q->append(
[qw[
http://www.cpan.org
http://metacpan.org
( run in 0.481 second using v1.01-cache-2.11-cpan-a1f116cd669 )