Passed
Push — master ( 3a2ed0...151619 )
by PHPinnacle
06:13
created

ReflectionArguments   A

Complexity

Total Complexity 5

Size/Duplication

Total Lines 35
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
dl 0
loc 35
ccs 13
cts 13
cp 1
rs 10
c 0
b 0
f 0
wmc 5

1 Method

Rating   Name   Duplication   Size   Complexity  
B resolve() 0 22 5
1
<?php
2
/**
3
 * This file is part of PHPinnacle/Ensign.
4
 *
5
 * (c) PHPinnacle Team <[email protected]>
6
 *
7
 * For the full copyright and license information, please view the LICENSE
8
 * file that was distributed with this source code.
9
 */
10
11
declare(strict_types = 1);
12
13
namespace PHPinnacle\Ensign\Arguments;
14
15
use PHPinnacle\Ensign\Arguments;
16
17
abstract class ReflectionArguments implements Arguments
18
{
19
    /**
20
     * {@inheritdoc}
21
     */
22 4
    public function resolve(callable $callable): array
23
    {
24 4
        $arguments  = [];
25
26 4
        $closure    = \Closure::fromCallable($callable);
27 4
        $reflection = new \ReflectionMethod($closure, '__invoke');
28 4
        $parameters = $reflection->getParameters();
29
30 4
        foreach ($parameters as $parameter) {
31 4
            if (!$class = $parameter->getClass()) {
32 3
                continue;
33
            }
34
35 4
            $expected = $class->getName();
36 4
            $instance = $this->resolveArgument($class);
37
38 4
            if (\is_object($instance) && $instance instanceof $expected) {
39 4
                $arguments[$parameter->getPosition()] = $instance;
40
            }
41
        }
42
43 4
        return $arguments;
44
    }
45
46
    /**
47
     * @param \ReflectionClass $class
48
     *
49
     * @return object
50
     */
51
    abstract protected function resolveArgument(\ReflectionClass $class);
52
}
53