# You may distribute under the terms of either the GNU General Public License # or the Artistic License (the same terms as Perl itself) # # (C) Paul Evans, 2014-2021 -- leonerd@leonerd.org.uk package Event::Distributor::Signal 0.06; use v5.14; use warnings; use base qw( Event::Distributor::_Event ); use Future; =head1 NAME C - an event that returns no result =head1 DESCRIPTION This subclass of L invokes each of its subscribers in turn, ensuring each has a chance to be invoked regardless of the result of the others. Its L succeeds (with no value) if no subscriber failed. If one subscriber failed, the C fails in the same way. If two or more subscribers fail, the resulting C fails with a message composed by combining all the individual messages, in the C category, whose failure details are a list of the failed component futures. =cut sub fire { my $self = shift; my ( $dist, @args ) = @_; return Future->wait_all( map { my $sub = $_; local $_; # protect against corruption of $_ Future->call( $sub, $dist, @args ); } $self->subscribers )->then( sub { my @failed = grep { $_->failure } @_; return Future->done() if !@failed; return $failed[0] if @failed == 1; return Future->fail( "Multiple subscribers failed:\n" . join( "", map { " | " . $_->failure } @failed ), distributor => @failed, ); }); } =head1 AUTHOR Paul Evans =cut 0x55AA