| 
<?phpnamespace 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);
 }
 }
 ?>
 |