public function onRegister(\FutoIn\AsyncSteps $as, $info)
 {
     SpecTools::loadSpec($as, $info, $this->specdirs);
     if ($this->development_checks) {
         SpecTools::checkConsistency($as, $info);
     }
 }
예제 #2
0
 /**
  * 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;
     }
 }