From 1148c841478ea146506659b6bcd1f1c1db041fb5 Mon Sep 17 00:00:00 2001 From: Oliver Vogel Date: Sun, 31 Dec 2023 17:26:41 +0100 Subject: [PATCH] Add interface for driver specializing objects --- src/Drivers/AbstractDriver.php | 11 +++-- src/Drivers/DriverSpecialized.php | 54 +++++++++++++++++++++++ src/Drivers/DriverSpecializedAnalyzer.php | 24 +--------- src/Drivers/DriverSpecializedEncoder.php | 25 +---------- src/Drivers/DriverSpecializedModifier.php | 36 +-------------- src/Image.php | 6 +-- src/Interfaces/DriverInterface.php | 2 +- src/Interfaces/SpecializedInterface.php | 29 ++++++++++++ 8 files changed, 97 insertions(+), 90 deletions(-) create mode 100644 src/Drivers/DriverSpecialized.php create mode 100644 src/Interfaces/SpecializedInterface.php diff --git a/src/Drivers/AbstractDriver.php b/src/Drivers/AbstractDriver.php index 723d6e05..e92851a5 100644 --- a/src/Drivers/AbstractDriver.php +++ b/src/Drivers/AbstractDriver.php @@ -23,7 +23,7 @@ abstract class AbstractDriver implements DriverInterface * @return object * @throws NotSupportedException */ - public function resolve(object $input): object + public function specialize(object $input): object { if ($this->isExternal($input)) { return $input; @@ -31,15 +31,18 @@ abstract class AbstractDriver implements DriverInterface $driver_namespace = (new ReflectionClass($this))->getNamespaceName(); $class_path = substr(get_class($input), strlen("Intervention\\Image\\")); - $specialized = $driver_namespace . "\\" . $class_path; + $classname = $driver_namespace . "\\" . $class_path; - if (! class_exists($specialized)) { + if (!class_exists($classname)) { throw new NotSupportedException( "Class '" . $class_path . "' is not supported by " . $this->id() . " driver." ); } - return new $specialized($input, $this); + return forward_static_call([ + $classname, + 'buildSpecialized' + ], $input, $this); } /** diff --git a/src/Drivers/DriverSpecialized.php b/src/Drivers/DriverSpecialized.php new file mode 100644 index 00000000..5adb9ad4 --- /dev/null +++ b/src/Drivers/DriverSpecialized.php @@ -0,0 +1,54 @@ +generic = $generic; + $specialized->driver = $driver; + + return $specialized; + } + + public function driver(): DriverInterface + { + return $this->driver; + } + + public function generic(): object + { + return $this->generic; + } + + /** + * Magic method to read attributes of underlying modifier + * + * @param string $name + * @return mixed + */ + public function __get(string $name): mixed + { + return $this->generic->$name; + } + + /** + * Magic method to call methods of underlying modifier + * + * @param string $name + * @param array $arguments + * @return mixed + */ + public function __call(string $name, array $arguments): mixed + { + return $this->generic->$name(...$arguments); + } +} diff --git a/src/Drivers/DriverSpecializedAnalyzer.php b/src/Drivers/DriverSpecializedAnalyzer.php index 9f69f7d1..2dcc4a81 100644 --- a/src/Drivers/DriverSpecializedAnalyzer.php +++ b/src/Drivers/DriverSpecializedAnalyzer.php @@ -3,29 +3,7 @@ namespace Intervention\Image\Drivers; use Intervention\Image\Interfaces\AnalyzerInterface; -use Intervention\Image\Interfaces\DriverInterface; -abstract class DriverSpecializedAnalyzer implements AnalyzerInterface +abstract class DriverSpecializedAnalyzer extends DriverSpecialized implements AnalyzerInterface { - public function __construct( - protected AnalyzerInterface $analyzer, - protected DriverInterface $driver - ) { - } - - public function driver(): DriverInterface - { - return $this->driver; - } - - /** - * Magic method to read attributes of underlying analyzer - * - * @param string $name - * @return mixed - */ - public function __get(string $name): mixed - { - return $this->analyzer->$name; - } } diff --git a/src/Drivers/DriverSpecializedEncoder.php b/src/Drivers/DriverSpecializedEncoder.php index 4c98da8b..038ccd7f 100644 --- a/src/Drivers/DriverSpecializedEncoder.php +++ b/src/Drivers/DriverSpecializedEncoder.php @@ -2,33 +2,10 @@ namespace Intervention\Image\Drivers; -use Intervention\Image\Interfaces\DriverInterface; use Intervention\Image\Interfaces\EncoderInterface; -abstract class DriverSpecializedEncoder implements EncoderInterface +abstract class DriverSpecializedEncoder extends DriverSpecialized implements EncoderInterface { - public function __construct( - protected EncoderInterface $encoder, - protected DriverInterface $driver - ) { - } - - public function driver(): DriverInterface - { - return $this->driver; - } - - /** - * Magic method to read attributes of underlying encoder - * - * @param string $name - * @return mixed - */ - public function __get(string $name): mixed - { - return $this->encoder->$name; - } - /** * Get return value of callback through output buffer * diff --git a/src/Drivers/DriverSpecializedModifier.php b/src/Drivers/DriverSpecializedModifier.php index 8f71a3b8..8c910f1c 100644 --- a/src/Drivers/DriverSpecializedModifier.php +++ b/src/Drivers/DriverSpecializedModifier.php @@ -2,42 +2,8 @@ namespace Intervention\Image\Drivers; -use Intervention\Image\Interfaces\DriverInterface; use Intervention\Image\Interfaces\ModifierInterface; -abstract class DriverSpecializedModifier implements ModifierInterface +abstract class DriverSpecializedModifier extends DriverSpecialized implements ModifierInterface { - public function __construct( - protected ModifierInterface $modifier, - protected DriverInterface $driver - ) { - } - - public function driver(): DriverInterface - { - return $this->driver; - } - - /** - * Magic method to read attributes of underlying modifier - * - * @param string $name - * @return mixed - */ - public function __get(string $name): mixed - { - return $this->modifier->$name; - } - - /** - * Magic method to call methods of underlying modifier - * - * @param string $name - * @param array $arguments - * @return mixed - */ - public function __call(string $name, array $arguments): mixed - { - return $this->modifier->$name(...$arguments); - } } diff --git a/src/Image.php b/src/Image.php index 72ea50bd..b571ca44 100644 --- a/src/Image.php +++ b/src/Image.php @@ -229,7 +229,7 @@ final class Image implements ImageInterface */ public function modify(ModifierInterface $modifier): ImageInterface { - return $this->driver->resolve($modifier)->apply($this); + return $this->driver->specialize($modifier)->apply($this); } /** @@ -239,7 +239,7 @@ final class Image implements ImageInterface */ public function analyze(AnalyzerInterface $analyzer): mixed { - return $this->driver->resolve($analyzer)->analyze($this); + return $this->driver->specialize($analyzer)->analyze($this); } /** @@ -249,7 +249,7 @@ final class Image implements ImageInterface */ public function encode(EncoderInterface $encoder = new AutoEncoder()): EncodedImage { - return $this->driver->resolve($encoder)->encode($this); + return $this->driver->specialize($encoder)->encode($this); } /** diff --git a/src/Interfaces/DriverInterface.php b/src/Interfaces/DriverInterface.php index 232291b6..675ced87 100644 --- a/src/Interfaces/DriverInterface.php +++ b/src/Interfaces/DriverInterface.php @@ -17,7 +17,7 @@ interface DriverInterface * @param object $input * @return object */ - public function resolve(object $input): object; + public function specialize(object $input): object; /** * Create new image instance with the current driver in given dimensions diff --git a/src/Interfaces/SpecializedInterface.php b/src/Interfaces/SpecializedInterface.php new file mode 100644 index 00000000..c01b06f2 --- /dev/null +++ b/src/Interfaces/SpecializedInterface.php @@ -0,0 +1,29 @@ +