From b3f53d425d3c05c43bb358bf899d7a845afed072 Mon Sep 17 00:00:00 2001
From: Bart Jaskulski <bjaskulski@protonmail.com>
Date: Mon, 8 Jul 2024 08:22:21 +0200
Subject: [PATCH] refactor: split binder interface

Possibility to check, if binder is available is not necessary for
outside usage besides `CompositeBinder` class, so this interface can be
split and implemented only by specific classes.

Signed-off-by: Bart Jaskulski <bjaskulski@protonmail.com>
---
 src/Binding/Binder.php                           |  2 --
 src/Binding/Binder/CallableBinder.php            | 16 +++++++---------
 src/Binding/Binder/CompositeBinder.php           | 10 ----------
 src/Binding/Binder/HookableBinder.php            |  8 +++-----
 src/Binding/Binder/StoppableBinder.php           |  4 ++--
 src/Binding/ComposableBinder.php                 | 13 +++++++++++++
 ...rayBindingLoader.php => ArrayDefinitions.php} |  0
 7 files changed, 25 insertions(+), 28 deletions(-)
 create mode 100644 src/Binding/ComposableBinder.php
 rename src/Binding/Loader/{ArrayBindingLoader.php => ArrayDefinitions.php} (100%)

diff --git a/src/Binding/Binder.php b/src/Binding/Binder.php
index 3997c59..0dc334f 100644
--- a/src/Binding/Binder.php
+++ b/src/Binding/Binder.php
@@ -6,7 +6,5 @@ namespace WPDesk\Init\Binding;
 
 interface Binder {
 
-	public function can_bind( Definition $def ): bool;
-
 	public function bind( Definition $def ): void;
 }
diff --git a/src/Binding/Binder/CallableBinder.php b/src/Binding/Binder/CallableBinder.php
index f0561b5..7085800 100644
--- a/src/Binding/Binder/CallableBinder.php
+++ b/src/Binding/Binder/CallableBinder.php
@@ -5,11 +5,11 @@ declare(strict_types=1);
 namespace WPDesk\Init\Binding\Binder;
 
 use Psr\Container\ContainerInterface;
-use WPDesk\Init\Binding\Binder;
+use WPDesk\Init\Binding\ComposableBinder;
 use WPDesk\Init\Binding\Definition;
 use WPDesk\Init\Binding\Definition\CallableDefinition;
 
-class CallableBinder implements Binder {
+class CallableBinder implements ComposableBinder {
 
 	/** @var ContainerInterface */
 	private $container;
@@ -23,13 +23,11 @@ class CallableBinder implements Binder {
 	}
 
 	public function bind( Definition $def ): void {
-		if ( $def instanceof CallableDefinition ) {
-			$ref        = new \ReflectionFunction( $def->value() );
-			$parameters = [];
-			foreach ( $ref->getParameters() as $ref_param ) {
-				$parameters[] = $this->container->get( $ref_param->getType()->getName() );
-			}
-			$ref->invokeArgs( $parameters );
+		$ref        = new \ReflectionFunction( $def->value() );
+		$parameters = [];
+		foreach ( $ref->getParameters() as $ref_param ) {
+		$parameters[] = $this->container->get( $ref_param->getType()->getName() );
 		}
+		$ref->invokeArgs( $parameters );
 	}
 }
diff --git a/src/Binding/Binder/CompositeBinder.php b/src/Binding/Binder/CompositeBinder.php
index 569b3fc..8b88634 100644
--- a/src/Binding/Binder/CompositeBinder.php
+++ b/src/Binding/Binder/CompositeBinder.php
@@ -21,16 +21,6 @@ final class CompositeBinder implements Binder {
 		$this->binders[] = $binder;
 	}
 
-	public function can_bind( Definition $def ): bool {
-		foreach ( $this->binders as $binder ) {
-			if ( $binder->can_bind( $def ) ) {
-				return true;
-			}
-		}
-
-		return false;
-	}
-
 	public function bind( Definition $def ): void {
 		foreach ( $this->binders as $binder ) {
 			if ( $binder->can_bind( $def ) ) {
diff --git a/src/Binding/Binder/HookableBinder.php b/src/Binding/Binder/HookableBinder.php
index c0d7a7a..f8426da 100644
--- a/src/Binding/Binder/HookableBinder.php
+++ b/src/Binding/Binder/HookableBinder.php
@@ -5,11 +5,11 @@ declare(strict_types=1);
 namespace WPDesk\Init\Binding\Binder;
 
 use Psr\Container\ContainerInterface;
-use WPDesk\Init\Binding\Binder;
+use WPDesk\Init\Binding\ComposableBinder;
 use WPDesk\Init\Binding\Definition;
 use WPDesk\Init\Binding\Definition\HookableDefinition;
 
-class HookableBinder implements Binder {
+class HookableBinder implements ComposableBinder {
 
 	/** @var ContainerInterface */
 	private $container;
@@ -23,8 +23,6 @@ class HookableBinder implements Binder {
 	}
 
 	public function bind( Definition $def ): void {
-		if ( $def instanceof HookableDefinition ) {
-			$this->container->get( $def->value() )->hooks();
-		}
+		$this->container->get( $def->value() )->hooks();
 	}
 }
diff --git a/src/Binding/Binder/StoppableBinder.php b/src/Binding/Binder/StoppableBinder.php
index 3b15700..e74c7e0 100644
--- a/src/Binding/Binder/StoppableBinder.php
+++ b/src/Binding/Binder/StoppableBinder.php
@@ -5,12 +5,12 @@ declare(strict_types=1);
 namespace WPDesk\Init\Binding\Binder;
 
 use Psr\Container\ContainerInterface;
-use WPDesk\Init\Binding\Binder;
+use WPDesk\Init\Binding\ComposableBinder;
 use WPDesk\Init\Binding\StoppableBinder as Stop;
 use WPDesk\Init\Binding\Definition;
 use WPDesk\Init\Binding\Definition\HookableDefinition;
 
-class StoppableBinder implements Binder {
+class StoppableBinder implements ComposableBinder {
 
 	/** @var ContainerInterface */
 	private $container;
diff --git a/src/Binding/ComposableBinder.php b/src/Binding/ComposableBinder.php
new file mode 100644
index 0000000..8498244
--- /dev/null
+++ b/src/Binding/ComposableBinder.php
@@ -0,0 +1,13 @@
+<?php
+
+declare(strict_types=1);
+
+namespace WPDesk\Init\Binding;
+
+/**
+ * Can be composed with other binders within {@see CompositeBinder} class.
+ */
+interface ComposableBinder extends Binder {
+
+	public function can_bind( Definition $def ): bool;
+}
diff --git a/src/Binding/Loader/ArrayBindingLoader.php b/src/Binding/Loader/ArrayDefinitions.php
similarity index 100%
rename from src/Binding/Loader/ArrayBindingLoader.php
rename to src/Binding/Loader/ArrayDefinitions.php
-- 
GitLab