<?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}"); } }