protected function CachedModuleHandler::getImplementationInfo

Overrides \Drupal\Core\Extension\ModuleHandler::getImplementationInfo().

Overrides ModuleHandler::getImplementationInfo

File

drupal/core/lib/Drupal/Core/Extension/CachedModuleHandler.php, line 122
Contains Drupal\Core\Extension\CachedModuleHandler.

Class

CachedModuleHandler
Class that manages enabled modules in a Drupal installation.

Namespace

Drupal\Core\Extension

Code

protected function getImplementationInfo($hook) {
  if (!isset($this->implementations)) {
    $this->implementations = $this
      ->getCachedImplementationInfo();
  }
  if (!isset($this->implementations[$hook])) {

    // The hook is not cached, so ensure that whether or not it has
    // implementations, the cache is updated at the end of the request.
    $this->cacheNeedsWriting = TRUE;
    $this->implementations[$hook] = parent::getImplementationInfo($hook);
  }
  else {
    foreach ($this->implementations[$hook] as $module => $group) {

      // If this hook implementation is stored in a lazy-loaded file, include
      // that file first.
      if ($group) {
        $this
          ->loadInclude($module, 'inc', "{$module}.{$group}");
      }

      // It is possible that a module removed a hook implementation without the
      // implementations cache being rebuilt yet, so we check whether the
      // function exists on each request to avoid undefined function errors.
      // Since module_hook() may needlessly try to load the include file again,
      // function_exists() is used directly here.
      if (!function_exists($module . '_' . $hook)) {

        // Clear out the stale implementation from the cache and force a cache
        // refresh to forget about no longer existing hook implementations.
        unset($this->implementations[$hook][$module]);
        $this->cacheNeedsWriting = TRUE;
      }
    }
  }
  return $this->implementations[$hook];
}