/**
  * @param LoopInterface $loop
  * @param array $options
  * @param null $termiteCallable
  * @return Messenger
  */
 public static function child(LoopInterface $loop, array $options = [], $termiteCallable = null)
 {
     $messenger = new Messenger(new Stream(STDIN, $loop), new Stream(STDOUT, $loop), new Stream(STDERR, $loop), ['read' => 'stdin', 'write_err' => 'stderr', 'write' => 'stdout'] + $options);
     if ($termiteCallable === null) {
         $termiteCallable = function () use($loop) {
             $loop->addTimer(self::TERMINATE_TIMEOUT, [$loop, 'stop']);
         };
     }
     $messenger->registerRpc(Messenger::TERMINATE_RPC, function (Payload $payload, Messenger $messenger) use($loop, $termiteCallable) {
         $messenger->emit('terminate', [$messenger]);
         $termiteCallable($payload, $messenger);
         return new FulfilledPromise();
     });
     return $messenger;
 }