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

ReflectionArguments::resolve()   B

Complexity

Conditions 5
Paths 4

Size

Total Lines 22
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 13
CRAP Score 5

Importance

Changes 0
Metric Value
cc 5
eloc 12
nc 4
nop 1
dl 0
loc 22
ccs 13
cts 13
cp 1
crap 5
rs 8.6737
c 0
b 0
f 0
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