You are here

public function RulesAbstractPlugin::rebuildCache in Rules 7.2

Add in the data provided by the info hooks to the cache.

Overrides RulesExtendable::rebuildCache

File

includes/rules.core.inc, line 1741
Rules base classes and interfaces needed for any rule evaluation.

Class

RulesAbstractPlugin
Defines a common base class for so-called "Abstract Plugins" like actions.

Code

public function rebuildCache(&$itemInfo, &$cache) {
  parent::rebuildCache($itemInfo, $cache);

  // Include all declared files so we can find all implementations.
  self::includeFiles();

  // Get the plugin's own info data.
  $cache[$this->itemName . '_info'] = rules_fetch_data($this->itemName . '_info');
  foreach ($cache[$this->itemName . '_info'] as $name => &$info) {
    $info += array(
      'parameter' => isset($info['arguments']) ? $info['arguments'] : array(),
      'provides' => isset($info['new variables']) ? $info['new variables'] : array(),
      'base' => $name,
      'callbacks' => array(),
    );
    unset($info['arguments'], $info['new variables']);
    if (function_exists($info['base'])) {
      $info['callbacks'] += array(
        'execute' => $info['base'],
      );
    }

    // We do not need to build a faces cache for RulesPluginHandlerInterface,
    // which gets added in automatically as its a parent of
    // RulesPluginImplInterface.
    unset($this->faces['RulesPluginHandlerInterface']);

    // Build up the per-plugin implementation faces cache.
    foreach ($this->faces as $interface) {
      $methods = $file_names = array();
      $includes = self::getIncludeFiles($info['module']);
      foreach (get_class_methods($interface) as $method) {
        if (isset($info['callbacks'][$method]) && ($function = $info['callbacks'][$method])) {
          $methods[$method][0] = $function;
          $file_names[$method] = $this
            ->getFileName($function, $includes);
        }
        elseif (isset($info['class']) && is_subclass_of($info['class'], $interface)) {
          $methods[$method][1] = $info['class'];
        }
        elseif (function_exists($function = $info['base'] . '_' . $method)) {
          $methods[$method][0] = $function;
          $file_names[$method] = $this
            ->getFileName($function, $includes);
        }
      }

      // Cache only the plugin implementation specific callbacks.
      $info['faces_cache'][$interface] = array(
        $methods,
        array_filter($file_names),
      );
    }

    // Filter out interfaces with no overridden methods.
    $info['faces_cache'] = rules_filter_array($info['faces_cache'], 0, TRUE);

    // We don't need that any more.
    unset($info['callbacks'], $info['base']);
  }
}