/**
  * Constructor
  *
  * Optionally specify project directory; $configFile will be relative to
  * this value.
  *
  * @param mixed  $discovery
  * @param string $projectDirectory
  */
 public function __construct($discovery, $projectDirectory = '')
 {
     $this->chain = Collection::create($discovery)->map(function ($discoveryClass) use($projectDirectory) {
         return new $discoveryClass($projectDirectory);
     })->filter(function ($discovery) {
         return $discovery->locate();
     });
 }
 /**
  * Constructor
  *
  * Optionally accept the project root directory; if non-empty, it is used
  * to prefix the $configFile.
  *
  * @param mixed $injectors
  * @param DiscoveryChainInterface $discoveryChain
  * @param Collection $availableTypes
  * @param string $projectRoot
  */
 public function __construct($injectors, DiscoveryChainInterface $discoveryChain, Collection $availableTypes, $projectRoot = '')
 {
     $this->chain = Collection::create($injectors)->filter(function ($injector, $file) use($discoveryChain) {
         return $discoveryChain->discoveryExists($file);
     })->map(function ($injector) use($projectRoot) {
         return new $injector($projectRoot);
     })->filter(function ($injector) use($availableTypes) {
         return $availableTypes->reduce(function ($flag, $type) use($injector) {
             return $flag || $injector->registersType($type);
         }, false);
     });
 }
 /**
  * Is a given metadata value (extra.zf.*) valid?
  *
  * @param string $key Key to examine in metadata
  * @param array $metadata
  * @return bool
  */
 private function metadataForKeyIsValid($key, array $metadata)
 {
     if (!isset($metadata[$key])) {
         return false;
     }
     if (is_string($metadata[$key])) {
         return $this->moduleIsValid($metadata[$key]);
     }
     if (!is_array($metadata[$key])) {
         return false;
     }
     return Collection::create($metadata[$key])->reduce(function ($valid, $value) {
         if (false === $valid) {
             return $valid;
         }
         return $this->moduleIsValid($value);
     }, null);
 }
 /**
  * Cache an injector for later use.
  *
  * @param Injector\InjectorInterface $injector
  * @return void
  */
 private function cacheInjector(Injector\InjectorInterface $injector)
 {
     Collection::create($injector->getTypesAllowed())->reject(function ($type) {
         return isset($this->cachedInjectors[$type]);
     })->each(function ($type) use($injector) {
         $this->cachedInjectors[$type] = $injector;
     });
 }