Proyectos de Subversion Moodle

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 1
<?php declare(strict_types=1);
2
 
3
namespace Invoker\ParameterResolver;
4
 
5
use ReflectionFunctionAbstract;
6
 
7
/**
8
 * Dispatches the call to other resolvers until all parameters are resolved.
9
 *
10
 * Chain of responsibility pattern.
11
 */
12
class ResolverChain implements ParameterResolver
13
{
14
    /** @var ParameterResolver[] */
15
    private $resolvers;
16
 
17
    public function __construct(array $resolvers = [])
18
    {
19
        $this->resolvers = $resolvers;
20
    }
21
 
22
    public function getParameters(
23
        ReflectionFunctionAbstract $reflection,
24
        array $providedParameters,
25
        array $resolvedParameters
26
    ): array {
27
        $reflectionParameters = $reflection->getParameters();
28
 
29
        foreach ($this->resolvers as $resolver) {
30
            $resolvedParameters = $resolver->getParameters(
31
                $reflection,
32
                $providedParameters,
33
                $resolvedParameters
34
            );
35
 
36
            $diff = array_diff_key($reflectionParameters, $resolvedParameters);
37
            if (empty($diff)) {
38
                // Stop traversing: all parameters are resolved
39
                return $resolvedParameters;
40
            }
41
        }
42
 
43
        return $resolvedParameters;
44
    }
45
 
46
    /**
47
     * Push a parameter resolver after the ones already registered.
48
     */
49
    public function appendResolver(ParameterResolver $resolver): void
50
    {
51
        $this->resolvers[] = $resolver;
52
    }
53
 
54
    /**
55
     * Insert a parameter resolver before the ones already registered.
56
     */
57
    public function prependResolver(ParameterResolver $resolver): void
58
    {
59
        array_unshift($this->resolvers, $resolver);
60
    }
61
}