<?php namespace eMacros\Runtime\Method;
use eMacros\Runtime\GenericFunction;
class MethodInvoke extends GenericFunction { /** * Method name * @var string */ public $method; public function __construct($method = null) { $this->method = $method; } /** * Invokes a method with the given arguments * Usage: (->format (new Datetime) "Y-m-d") * Returns: mixed * (non-PHPdoc) * @see \eMacros\Runtime\GenericFunction::execute() */ public function execute(array $arguments) { if (empty($arguments)) { throw new \BadFunctionCallException('MethodInvoke: No parameters found.'); } if (is_null($this->method)) { if (!isset($arguments[1])) { throw new \BadFunctionCallException('MethodInvoke: No instance defined.'); } //check method type if (!is_string($arguments[0])) { throw new \InvalidArgumentException(sprintf("MethodInvoke: A value of type string was expected as first argument but %s found instead.", gettype($arguments[0]))); } //check istance type if (!is_object($arguments[1])) { throw new \InvalidArgumentException(sprintf("MethodInvoke: A value of type object was expected but %s found instead.", gettype($arguments[1]))); } $method = $arguments[0]; $instance = $arguments[1]; $parameters = array_slice($arguments, 2); } else { if (!is_object($arguments[0])) { throw new \InvalidArgumentException(sprintf("MethodInvoke: A value of type object was expected but %s found instead.", gettype($arguments[0]))); } $method = $this->method; $instance = $arguments[0]; $parameters = array_slice($arguments, 1); }
//check method existence if (!method_exists($instance, $method)) { if (!method_exists($instance, '__call')) { throw new \InvalidArgumentException(sprintf("MethodInvoke: Method '$method' was not found on instance of '%s'.", get_class($instance))); } return call_user_func(array($instance, '__call'), $method, $parameters); } //check method access and required parameters $rm = new \ReflectionMethod($instance, $method); if (!$rm->isPublic()) { throw new \BadMethodCallException(sprintf("Method '%s' does not have public access.", $method)); } if ($rm->getNumberOfRequiredParameters() > count($parameters)) { throw new \BadMethodCallException(sprintf("Method '%s' expects at least %d argument(s).", $method, $rm->getNumberOfRequiredParameters())); } return call_user_func_array(array($instance, $method), $parameters); } } ?>
|