diff --git a/src/Moka/Factory/ProxyGeneratorFactory.php b/src/Moka/Factory/ProxyGeneratorFactory.php index 54c91dd..b153dd0 100644 --- a/src/Moka/Factory/ProxyGeneratorFactory.php +++ b/src/Moka/Factory/ProxyGeneratorFactory.php @@ -4,26 +4,44 @@ namespace Moka\Factory; use Moka\Generator\ProxyGenerator; +use Moka\Strategy\MockingStrategyInterface; class ProxyGeneratorFactory { /** - * @param string $fqcn + * @var array|ProxyGenerator[] + */ + private static $proxyGenerators = []; + + /** + * @param MockingStrategyInterface $mockingStrategy + * @return ProxyGenerator + */ + public static function get(MockingStrategyInterface $mockingStrategy): ProxyGenerator + { + $key = self::key($mockingStrategy); + if (!array_key_exists($key, self::$proxyGenerators) || !self::$proxyGenerators[$key] instanceof ProxyGenerator) { + self::$proxyGenerators[$key] = static::build($mockingStrategy); + } + + return self::$proxyGenerators[$key]; + } + + /** * @param MockingStrategyInterface $mockingStrategy - * @return ProxyInterface + * @return string */ - public static function get(string $fqcn, MockingStrategyInterface $mockingStrategy) + private static function key(MockingStrategyInterface $mockingStrategy): string { - return (new ProxyGenerator($mockingStrategy)); + return get_class($mockingStrategy); } /** - * @param string $fqcn * @param MockingStrategyInterface $mockingStrategy - * @return ProxyInterface + * @return ProxyGenerator */ - protected static function build(string $fqcn, MockingStrategyInterface $mockingStrategy) + protected static function build(MockingStrategyInterface $mockingStrategy): ProxyGenerator { - return new Proxy($fqcn, $mockingStrategy); + return new ProxyGenerator($mockingStrategy); } } diff --git a/src/Moka/Generator/ProxyArgumentGenerator.php b/src/Moka/Generator/ProxyArgumentGenerator.php index a1ef581..5fcbbc3 100644 --- a/src/Moka/Generator/ProxyArgumentGenerator.php +++ b/src/Moka/Generator/ProxyArgumentGenerator.php @@ -3,9 +3,13 @@ namespace Moka\Generator; +/** + * Class ProxyArgumentGenerator + * @package Moka\Generator + */ class ProxyArgumentGenerator { - public static function generateMethodParameter(\ReflectionParameter $parameter) + public static function generateMethodParameter(\ReflectionParameter $parameter): string { try { $allowsNull = $parameter->allowsNull(); @@ -33,7 +37,6 @@ public static function generateMethodParameter(\ReflectionParameter $parameter) $name = '$' . $parameter->getName(); -// $canBePassByValue = $parameter->canBePassedByValue(); $isPassedByReference = $parameter->isPassedByReference(); $byReference = ''; if ($isPassedByReference) { diff --git a/src/Moka/Generator/ProxyTrait.php b/src/Moka/Generator/ProxyTrait.php index b9b7490..6d20a69 100644 --- a/src/Moka/Generator/ProxyTrait.php +++ b/src/Moka/Generator/ProxyTrait.php @@ -11,7 +11,10 @@ trait ProxyTrait { - private $object; + /** + * @var object + */ + private $mock; /** * @var MockingStrategyInterface @@ -25,7 +28,7 @@ public function __construct() public function __call($name, array $arguments) { if ($this->mockingStrategy instanceof MockingStrategyInterface) { - return $this->mockingStrategy->call($this->object, $name, $arguments); + return $this->mockingStrategy->call($this->mock, $name, $arguments); } } @@ -34,7 +37,7 @@ public function __call($name, array $arguments) */ public function _moka_setObject($object) { - $this->object = $object; + $this->mock = $object; } public function _moka_setMockingStrategy(MockingStrategyInterface $mockingStrategy) @@ -51,7 +54,7 @@ public function _moka_setMockingStrategy(MockingStrategyInterface $mockingStrate */ public function stub(array $methodsWithValues): ProxyInterface { - $this->mockingStrategy->decorate($this->object, $methodsWithValues); + $this->mockingStrategy->decorate($this->mock, $methodsWithValues); return $this; } @@ -60,9 +63,11 @@ public function stub(array $methodsWithValues): ProxyInterface * @return object * * @throws MockNotServedException + * + * @deprecated since v2.0.0 */ public function serve() { - return $this->object; + return $this->mock; } } diff --git a/src/Moka/Proxy/ProxyInterface.php b/src/Moka/Proxy/ProxyInterface.php index 0158ec2..e929a57 100644 --- a/src/Moka/Proxy/ProxyInterface.php +++ b/src/Moka/Proxy/ProxyInterface.php @@ -26,6 +26,8 @@ public function stub(array $methodsWithValues): ProxyInterface; * @return object * * @throws MockNotServedException + * + * @deprecated since v2.0.0 */ public function serve(); } diff --git a/src/Moka/Strategy/AbstractMockingStrategy.php b/src/Moka/Strategy/AbstractMockingStrategy.php index 9a36c03..9fb7147 100644 --- a/src/Moka/Strategy/AbstractMockingStrategy.php +++ b/src/Moka/Strategy/AbstractMockingStrategy.php @@ -71,6 +71,9 @@ abstract protected function doBuild(string $fqcn); * @param object $mock * @param array $stubs * @return void + * + * @throws InvalidArgumentException + * @throws NotImplementedException */ public function decorate($mock, array $stubs) {