public function onRegister(\FutoIn\AsyncSteps $as, $info) { SpecTools::loadSpec($as, $info, $this->specdirs); if ($this->development_checks) { SpecTools::checkConsistency($as, $info); } }
/** * Register implementation of specific FutoIn interface with specific version * @param string $ifacever "iface:version" pair as per the spec * @param string|InterfaceImplementation $impl Either class name for lazy loading or already instantiated object * @return void */ public function register(\FutoIn\AsyncSteps $as, $ifacever, $impl) { if (!preg_match('/^([a-z][a-z0-9]*)(\\.[a-z][a-z0-9]*)+:[0-9]+\\.[0-9]+$/i', $ifacever)) { $as->error(\FutoIn\Error::InternalError, "Invalid ifacever"); } $ifacever = explode(':', $ifacever); $mjrmnr = explode('.', $ifacever[1]); $name = $ifacever[0]; $mjr = $mjrmnr[0]; // Double registration is not allowed if (isset($this->ifaces[$name][$mjr])) { $as->error(\FutoIn\Error::InternalError, "Already registered"); } if (!is_string($impl) && !$impl instanceof \FutoIn\Executor\InterfaceImplementation && !$impl instanceof Closure && !is_callable($impl)) { $as->error(\FutoIn\Error::InternalError, "Impl is not Object/String/Callable"); } $info = new RegistrationInfo(); $info->iface = $name; $info->version = $ifacever[1]; $info->mjrver = $mjr; $info->mnrver = $mjrmnr[1]; SpecTools::loadSpec($as, $info, $this->specdirs); if (!isset($this->ifaces[$name])) { $this->ifaces[$name] = []; $this->impls[$name] = []; } $this->ifaces[$name][$mjr] = $info; $this->impls[$name][$mjr] = $impl; // Create aliases of super interfaces for runtime lookup foreach ($info->inherits as $sup) { $sup = explode(':', $sup); $supmjrmnr = explode('.', $sup[1]); $supname = $sup[0]; $supmjr = $supmjrmnr[0]; $supinfo = new RegistrationInfo(); $supinfo->iface = $supname; $supinfo->version = $sup[1]; $supinfo->mjrver = $supmjr; $supinfo->mnrver = $supmjrmnr[1]; $supinfo->derived = $info; if (isset($this->ifaces[$supname][$supmjr])) { unset($this->ifaces[$name][$mjr]); $as->error(\FutoIn\Error::InternalError, "Conflict with inherited interfaces"); } $this->ifaces[$supname][$supmjr] = $supinfo; } }