/** * @param string $className * @param LoopInterface $loop * @param array $options * @param float $interval * @return \React\Promise\PromiseInterface * @throws \Exception */ public static function parentFromClass($className, LoopInterface $loop, array $options = [], $interval = self::INTERVAL) { if (!is_subclass_of($className, 'WyriHaximus\\React\\ChildProcess\\Messenger\\ChildInterface')) { throw new \Exception('Given class doesn\'t implement ChildInterface'); } $template = '%s'; if (isset($options['cmdTemplate'])) { $template = $options['cmdTemplate']; unset($options['cmdTemplate']); } $process = new Process(sprintf($template, self::getProcessForCurrentOS() . ' ' . ArgvEncoder::encode($options))); return static::parent($process, $loop, $options, $interval)->then(function (Messenger $messenger) use($className) { return $messenger->rpc(MessengesFactory::rpc(Factory::PROCESS_REGISTER, ['className' => $className]))->then(function () use($messenger) { return \React\Promise\resolve($messenger); }); }); }