CallableReflectionFactory.php
52 lines
| 1 | <?php |
| 2 | /** |
| 3 | * PHP-DI |
| 4 | * |
| 5 | * @link http://php-di.org/ |
| 6 | * @copyright Matthieu Napoli (http://mnapoli.fr/) |
| 7 | * @license http://www.opensource.org/licenses/mit-license.php MIT (see the LICENSE file) |
| 8 | */ |
| 9 | |
| 10 | namespace Cybot\Dependencies\DI\Reflection; |
| 11 | |
| 12 | /** |
| 13 | * Create a reflection object from a callable. |
| 14 | * |
| 15 | * @author Matthieu Napoli <matthieu@mnapoli.fr> |
| 16 | */ |
| 17 | class CallableReflectionFactory |
| 18 | { |
| 19 | /** |
| 20 | * @param callable $callable |
| 21 | * |
| 22 | * @return \ReflectionFunctionAbstract |
| 23 | */ |
| 24 | public static function fromCallable($callable) |
| 25 | { |
| 26 | // Array callable |
| 27 | if (is_array($callable)) { |
| 28 | list($class, $method) = $callable; |
| 29 | |
| 30 | return new \ReflectionMethod($class, $method); |
| 31 | } |
| 32 | |
| 33 | // Closure |
| 34 | if ($callable instanceof \Closure) { |
| 35 | return new \ReflectionFunction($callable); |
| 36 | } |
| 37 | |
| 38 | // Callable object (i.e. implementing __invoke()) |
| 39 | if (is_object($callable) && method_exists($callable, '__invoke')) { |
| 40 | return new \ReflectionMethod($callable, '__invoke'); |
| 41 | } |
| 42 | |
| 43 | // Callable class (i.e. implementing __invoke()) |
| 44 | if (is_string($callable) && class_exists($callable) && method_exists($callable, '__invoke')) { |
| 45 | return new \ReflectionMethod($callable, '__invoke'); |
| 46 | } |
| 47 | |
| 48 | // Standard function |
| 49 | return new \ReflectionFunction($callable); |
| 50 | } |
| 51 | } |
| 52 |