You are here

CachedDoubler.php in Zircon Profile 8

Same filename and directory in other branches
  1. 8.0 vendor/phpspec/prophecy/src/Prophecy/Doubler/CachedDoubler.php

Namespace

Prophecy\Doubler

File

vendor/phpspec/prophecy/src/Prophecy/Doubler/CachedDoubler.php
View source
<?php

/*
 * This file is part of the Prophecy.
 * (c) Konstantin Kudryashov <ever.zet@gmail.com>
 *     Marcello Duarte <marcello.duarte@gmail.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */
namespace Prophecy\Doubler;

use ReflectionClass;

/**
 * Cached class doubler.
 * Prevents mirroring/creation of the same structure twice.
 *
 * @author Konstantin Kudryashov <ever.zet@gmail.com>
 */
class CachedDoubler extends Doubler {
  private $classes = array();

  /**
   * {@inheritdoc}
   */
  public function registerClassPatch(ClassPatch\ClassPatchInterface $patch) {
    $this->classes[] = array();
    parent::registerClassPatch($patch);
  }

  /**
   * {@inheritdoc}
   */
  protected function createDoubleClass(ReflectionClass $class = null, array $interfaces) {
    $classId = $this
      ->generateClassId($class, $interfaces);
    if (isset($this->classes[$classId])) {
      return $this->classes[$classId];
    }
    return $this->classes[$classId] = parent::createDoubleClass($class, $interfaces);
  }

  /**
   * @param ReflectionClass   $class
   * @param ReflectionClass[] $interfaces
   *
   * @return string
   */
  private function generateClassId(ReflectionClass $class = null, array $interfaces) {
    $parts = array();
    if (null !== $class) {
      $parts[] = $class
        ->getName();
    }
    foreach ($interfaces as $interface) {
      $parts[] = $interface
        ->getName();
    }
    sort($parts);
    return md5(implode('', $parts));
  }

}

Classes

Namesort descending Description
CachedDoubler Cached class doubler. Prevents mirroring/creation of the same structure twice.