Chris@0: Chris@0: * Marcello Duarte Chris@0: * Chris@0: * For the full copyright and license information, please view the LICENSE Chris@0: * file that was distributed with this source code. Chris@0: */ Chris@0: Chris@0: namespace Prophecy\Doubler; Chris@0: Chris@0: use ReflectionClass; Chris@0: Chris@0: /** Chris@0: * Cached class doubler. Chris@0: * Prevents mirroring/creation of the same structure twice. Chris@0: * Chris@0: * @author Konstantin Kudryashov Chris@0: */ Chris@0: class CachedDoubler extends Doubler Chris@0: { Chris@0: private $classes = array(); Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function registerClassPatch(ClassPatch\ClassPatchInterface $patch) Chris@0: { Chris@0: $this->classes[] = array(); Chris@0: Chris@0: parent::registerClassPatch($patch); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: protected function createDoubleClass(ReflectionClass $class = null, array $interfaces) Chris@0: { Chris@0: $classId = $this->generateClassId($class, $interfaces); Chris@0: if (isset($this->classes[$classId])) { Chris@0: return $this->classes[$classId]; Chris@0: } Chris@0: Chris@0: return $this->classes[$classId] = parent::createDoubleClass($class, $interfaces); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @param ReflectionClass $class Chris@0: * @param ReflectionClass[] $interfaces Chris@0: * Chris@0: * @return string Chris@0: */ Chris@0: private function generateClassId(ReflectionClass $class = null, array $interfaces) Chris@0: { Chris@0: $parts = array(); Chris@0: if (null !== $class) { Chris@0: $parts[] = $class->getName(); Chris@0: } Chris@0: foreach ($interfaces as $interface) { Chris@0: $parts[] = $interface->getName(); Chris@0: } Chris@0: sort($parts); Chris@0: Chris@0: return md5(implode('', $parts)); Chris@0: } Chris@0: }