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\Reflection;
4
 
5
use Closure;
6
use Invoker\Exception\NotCallableException;
7
use ReflectionException;
8
use ReflectionFunction;
9
use ReflectionFunctionAbstract;
10
use ReflectionMethod;
11
 
12
/**
13
 * Create a reflection object from a callable or a callable-like.
14
 *
15
 * @internal
16
 */
17
class CallableReflection
18
{
19
    /**
20
     * @param callable|array|string $callable Can be a callable or a callable-like.
21
     * @throws NotCallableException|ReflectionException
22
     */
23
    public static function create($callable): ReflectionFunctionAbstract
24
    {
25
        // Closure
26
        if ($callable instanceof Closure) {
27
            return new ReflectionFunction($callable);
28
        }
29
 
30
        // Array callable
31
        if (is_array($callable)) {
32
            [$class, $method] = $callable;
33
 
34
            if (! method_exists($class, $method)) {
35
                throw NotCallableException::fromInvalidCallable($callable);
36
            }
37
 
38
            return new ReflectionMethod($class, $method);
39
        }
40
 
41
        // Callable object (i.e. implementing __invoke())
42
        if (is_object($callable) && method_exists($callable, '__invoke')) {
43
            return new ReflectionMethod($callable, '__invoke');
44
        }
45
 
46
        // Standard function
47
        if (is_string($callable) && function_exists($callable)) {
48
            return new ReflectionFunction($callable);
49
        }
50
 
51
        throw new NotCallableException(sprintf(
52
            '%s is not a callable',
53
            is_string($callable) ? $callable : 'Instance of ' . get_class($callable)
54
        ));
55
    }
56
}