Acme-Sort-Sleep
view release on metacpan or search on metacpan
local/lib/perl5/IO/Async/Loop.pm view on Meta::CPAN
module will be chosen afterwards as a last-case attempt. If this also fails,
then the magic constructor itself will throw an exception.
=back
If any of the explicitly-requested loop types (C<$ENV{IO_ASYNC_LOOP}> or
C<$IO::Async::Loop::LOOP>) fails to load then a warning is printed detailing
the error.
Implementors of new C<IO::Async::Loop> subclasses should see the notes about
C<API_VERSION> below.
=cut
sub __try_new
{
my ( $class ) = @_;
( my $file = "$class.pm" ) =~ s{::}{/}g;
eval {
local $SIG{__WARN__} = sub {};
require $file;
} or return;
my $self;
$self = eval { $class->new } and return $self;
# Oh dear. We've loaded the code OK but for some reason the constructor
# wasn't happy. Being polite we ought really to unload the file again,
# but perl doesn't actually provide us a way to do this.
return undef;
}
sub new
{
return our $ONE_TRUE_LOOP ||= shift->really_new;
}
# Ensure that the loop is DESTROYed recursively at exit time, before GD happens
END {
undef our $ONE_TRUE_LOOP;
}
sub really_new
{
shift; # We're going to ignore the class name actually given
my $self;
my @candidates;
push @candidates, split( m/,/, $ENV{IO_ASYNC_LOOP} ) if defined $ENV{IO_ASYNC_LOOP};
push @candidates, split( m/,/, $LOOP ) if defined $LOOP;
foreach my $class ( @candidates ) {
$class =~ m/::/ or $class = "IO::Async::Loop::$class";
$self = __try_new( $class ) and return $self;
my ( $topline ) = split m/\n/, $@; # Ignore all the other lines; they'll be require's verbose output
warn "Unable to use $class - $topline\n";
}
unless( $LOOP_NO_OS ) {
foreach my $class ( IO::Async::OS->LOOP_PREFER_CLASSES, "IO::Async::Loop::$^O" ) {
$class =~ m/::/ or $class = "IO::Async::Loop::$class";
$self = __try_new( $class ) and return $self;
# Don't complain about these ones
}
}
return IO::Async::Loop->new_builtin;
}
sub new_builtin
{
shift;
my $self;
foreach my $class ( IO::Async::OS->LOOP_BUILTIN_CLASSES ) {
$self = __try_new( "IO::Async::Loop::$class" ) and return $self;
}
croak "Cannot find a suitable candidate class";
}
#######################
# Notifier management #
#######################
=head1 NOTIFIER MANAGEMENT
The following methods manage the collection of L<IO::Async::Notifier> objects.
=cut
=head2 add
$loop->add( $notifier )
This method adds another notifier object to the stored collection. The object
may be a L<IO::Async::Notifier>, or any subclass of it.
When a notifier is added, any children it has are also added, recursively. In
this way, entire sections of a program may be written within a tree of
notifier objects, and added or removed on one piece.
=cut
sub add
{
my $self = shift;
my ( $notifier ) = @_;
if( defined $notifier->parent ) {
croak "Cannot add a child notifier directly - add its parent";
}
if( defined $notifier->loop ) {
( run in 1.659 second using v1.01-cache-2.11-cpan-39bf76dae61 )