From fde3789b73cd889e90d55a94f1a94193de6b7fc1 Mon Sep 17 00:00:00 2001
From: dyszczo <krzysiek@inspirelabs.pl>
Date: Sun, 23 Sep 2018 22:39:55 +0200
Subject: [PATCH] chain resolver implementation

---
 src/Resolver/ChainResolver.php | 61 ++++++++++++++++++++++++++++++++++
 src/Resolver/DirResolver.php   |  2 +-
 src/Resolver/NullResolver.php  | 22 ++++++++++++
 3 files changed, 84 insertions(+), 1 deletion(-)
 create mode 100644 src/Resolver/ChainResolver.php
 create mode 100644 src/Resolver/NullResolver.php

diff --git a/src/Resolver/ChainResolver.php b/src/Resolver/ChainResolver.php
new file mode 100644
index 0000000..eaa394f
--- /dev/null
+++ b/src/Resolver/ChainResolver.php
@@ -0,0 +1,61 @@
+<?php
+
+namespace WPDesk\View\Resolver;
+
+
+use WPDesk\View\Renderer\Renderer;
+use WPDesk\View\Resolver\Exception\CanNotResolve;
+
+/**
+ * Provide resolvers and this class can try them one after another
+ *
+ * @package WPDesk\View\Resolver
+ */
+class ChainResolver implements Resolver
+{
+    /** @var Resolver[] */
+    private $resolvers;
+
+    /**
+     * Warning: function with variadic input. Input should be list of Resolver instances.
+     */
+    public function __construct()
+    {
+        $args = func_get_args();
+        foreach ($args as $resolver) {
+            $this->appendResolver($resolver);
+        }
+    }
+
+    /**
+     * Append resolver to the end of the list
+     *
+     * @param Resolver $resolver
+     */
+    public function appendResolver( $resolver)
+    {
+        $this->resolvers[] = $resolver;
+    }
+
+    /**
+     * Resolve name to full path
+     *
+     * @param string $name
+     * @param Renderer|null $renderer
+     *
+     * @return string
+     */
+    public function resolve($name, Renderer $renderer = null)
+    {
+        foreach ($this->resolvers as $resolver) {
+            try {
+                return $resolver->resolve($name);
+            } catch (CanNotResolve $e) {
+                // not interested
+            }
+        }
+
+        throw new CanNotResolve("Cannot resolve {$name}");
+    }
+
+}
diff --git a/src/Resolver/DirResolver.php b/src/Resolver/DirResolver.php
index f4ab594..5122631 100644
--- a/src/Resolver/DirResolver.php
+++ b/src/Resolver/DirResolver.php
@@ -21,7 +21,7 @@ class DirResolver implements Resolver
     /**
      * Base path for templates ie. subdir
      *
-     * @param $template_base_path
+     * @param $dir
      */
     public function __construct($dir)
     {
diff --git a/src/Resolver/NullResolver.php b/src/Resolver/NullResolver.php
new file mode 100644
index 0000000..4f69832
--- /dev/null
+++ b/src/Resolver/NullResolver.php
@@ -0,0 +1,22 @@
+<?php
+
+namespace WPDesk\View\Resolver;
+
+
+use WPDesk\View\Renderer\Renderer;
+use WPDesk\View\Resolver\Exception\CanNotResolve;
+
+/**
+ * This resolver never finds the file
+ *
+ * @package WPDesk\View\Resolver
+ */
+class NullResolver implements Resolver
+{
+
+    public function resolve($name, Renderer $renderer = null)
+    {
+        throw new CanNotResolve("Null Cannot resolve");
+    }
+
+}
-- 
GitLab