async sub fetch { my $loop = IO::Async::Loop->new; my @data; my $client = Net::Async::WebSocket::Client->new( on_text_frame => sub { my ( $clientself, $frame ) = @_; ... push @data, $frame; # when I had enough frames if( 10 < scalar @data ){ say "I am ".__PACKAGE__."::fetch() and we had enough data"; $clientself->close; $loop->stop; return; } } # on_text_frame ); $loop->add( $client ); await $client->connect(url => $myurl); # tell the WS that we need data $client->send_text_frame('send me data'); $loop->run; my $retdata = Future->done(\@data)->get; # save $retdata to file ... # and return return $retdata; } sub give_me_data { # collapse the future my $data = $self->fetch()->get(); # process data ... return $processed_data } #### # main use ModuleA; use ModuleB; sub give_me_data { # no Future here: my $dataA = ModuleA->new()->give_me_data(); my $dataB = ModuleB->new()->give_me_data(); return ... }