Passed
Push — master ( 943848...db2d78 )
by Sebastian
04:16
created

NamedClosure::fromArray()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 9
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 5
c 1
b 0
f 0
dl 0
loc 9
rs 10
cc 3
nc 3
nop 2
1
<?php
2
3
declare(strict_types=1);
4
5
namespace AppUtils;
6
7
use Closure;
8
9
class NamedClosure
10
{
11
    /**
12
     * @var Closure
13
     */
14
    private $closure;
15
16
    /**
17
     * @var string
18
     */
19
    private $origin;
20
21
    /**
22
     * NamedClosure constructor.
23
     * @param Closure $closure
24
     * @param string $origin
25
     */
26
    private function __construct(Closure $closure, string $origin)
27
    {
28
        $this->closure = $closure;
29
        $this->origin = $origin;
30
    }
31
32
    /**
33
     * @return string
34
     */
35
    public function getOrigin() : string
36
    {
37
        return $this->origin;
38
    }
39
40
    /**
41
     * @param Closure $closure
42
     * @param object|string $origin
43
     * @return NamedClosure
44
     */
45
    public static function fromClosure(Closure $closure, $origin) : NamedClosure
46
    {
47
        if(is_object($origin)) {
48
            $origin = get_class($origin);
49
        }
50
51
        return new NamedClosure($closure, $origin);
52
    }
53
54
    /**
55
     * @param object $object
56
     * @param string $method
57
     * @param string|object $origin
58
     * @return NamedClosure
59
     */
60
    public static function fromObject(object $object, string $method, $origin='') : NamedClosure
61
    {
62
        return self::fromArray(array($object, $method), $origin);
63
    }
64
65
    /**
66
     * @param array $callback
67
     * @param string|object $origin
68
     * @return NamedClosure
69
     */
70
    public static function fromArray(array $callback, $origin='') : NamedClosure
71
    {
72
        if(empty($origin)) {
73
            $origin = ConvertHelper::callback2string($callback);
74
        } else if(is_object($origin)) {
75
            $origin = get_class($origin);
76
        }
77
78
        return new NamedClosure(Closure::fromCallable($callback), $origin);
79
    }
80
81
    public function __invoke()
82
    {
83
        $args = func_get_args();
84
        $args[] = $this;
85
86
        return call_user_func($this->closure, ...$args);
87
    }
88
}
89