-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathFilterFunction.php
122 lines (95 loc) · 2.92 KB
/
FilterFunction.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
<?php
/**
* Filter Function
*
* @author Whizark <devaloka@whizark.com>
* @see http://whizark.com
* @copyright Copyright (C) 2014 Whizark.
* @license MIT
*/
namespace Devaloka\Component\EventConverter;
use Ecailles\CallableObject\CallableObject;
use ReflectionFunction;
use ReflectionMethod;
/**
* Class FilterFunction
*
* @package Devaloka\Component\EventConverter
*/
class FilterFunction
{
private $callable;
private $acceptedArgs;
private $parameters;
private $reflection;
public function __construct(CallableObject $callable, $acceptedArgs = 1)
{
$this->callable = $callable;
$this->acceptedArgs = $acceptedArgs;
}
public function getCallable()
{
return $this->callable;
}
public function getAcceptedArgs()
{
return $this->acceptedArgs;
}
public function __invoke()
{
$arguments = array_slice(func_get_args(), 0, $this->acceptedArgs);
return $this->invokeArgs($arguments);
}
public function invoke()
{
$arguments = array_slice(func_get_args(), 0, $this->acceptedArgs);
return $this->callable->invokeArgs($arguments);
}
public function invokeArgs(array $arguments)
{
$arguments = array_slice($arguments, 0, $this->acceptedArgs);
return $this->callable->invokeArgs($this->normalizeArguments($arguments));
}
public function hasParameters()
{
return (bool) $this->getReflection()->getNumberOfParameters();
}
public function getParameters()
{
if ($this->parameters !== null) {
return $this->parameters;
}
$reflection = $this->getReflection();
$this->parameters = [];
for ($i = 0, $length = $reflection->getNumberOfParameters(); $i < $length; $i ++) {
$this->parameters[$i] = new FilterFunctionParameter($this->callable, $i);
}
return $this->parameters;
}
private function normalizeArguments(array $arguments)
{
$parameters = $this->getParameters();
for ($i = 0, $length = count($parameters); $i < $length; $i ++) {
if ($parameters[$i]->isPassedByReference()) {
$arguments[$i] = & $arguments[$i];
}
}
return $arguments;
}
private function getReflection()
{
if ($this->reflection !== null) {
return $this->reflection;
}
if ($this->callable->isFunction() || $this->callable->isClosure()) {
$this->reflection = new ReflectionFunction($this->callable->get());
}
if ($this->callable->isInstanceMethod() || $this->callable->isClassMethod()) {
$callable = $this->callable->get();
$object = $callable[0];
$method = $callable[1];
$this->reflection = new ReflectionMethod($object, $method);
}
return $this->reflection;
}
}