The author, LeoNerd, suggests using either Future or Async::MergePoint which both fullfill my needs - Future in a more generalized way, and MergePoint exactly in the form I imagined when writing my post.