| 
<?php
/**
 * @package QuickAPI
 * @version 1.0
 * @author RReverser
 */
 
 /** Interface to mark class for auto-registering of methods */
 interface QAPI_Interface {}
 
 /** Main class for API methods manipulation */
 class QAPI implements Serializable
 {
 /** Registered methods */
 private $methods = array();
 
 /**
 * Register callable as API handler
 * @param string|array $funcName Callable API handler
 * @param string $name Name for API method
 * @return bool
 */
 function registerFunction($funcName, $name = null)
 {
 if(is_callable($funcName))
 {
 if($name === null)
 {
 $name = is_array($funcName) ? $funcName[1] : $funcName;
 }
 $name = strtolower($name);
 $this->methods[$name] = $funcName;
 return true;
 } else
 {
 return false;
 }
 }
 
 /**
 * Register object method
 * @param object $object Object with method to be registered as API handler
 * @param string $methodName Name of method to be registered
 * @param string $name Name for API method
 * @return bool
 */
 function registerMethod($object, $methodName, $name = null)
 {
 if(substr($methodName, 0, 2) == '__')
 {
 return false;
 }
 if($name === null)
 {
 $name = $methodName;
 }
 return $this->registerFunction(array($object, $methodName), $name);
 }
 
 /**
 * Register class static method
 * @param string $className Class with static method to be registered as API handler
 * @param string $methodName Name of method to be registered
 * @param string $name Name for API method
 * @return bool
 */
 function registerStatic($className, $methodName, $name = null)
 {
 if(substr($methodName, 0, 2) == '__')
 {
 return false;
 }
 if($name === null)
 {
 $name = $methodName;
 }
 return $this->registerFunction($className . '::' . $methodName, $name);
 }
 
 /**
 * Register object
 * @param object $object Object with methods to be registered as API handlers
 * @param string $prefix Prefix for object and class methods (use '$' to insert class name)
 * @return bool
 */
 function registerObject($object, $prefix = '')
 {
 if(!is_object($object)) return false;
 $className = get_class($object);
 $prefix = str_replace('$', $className, $prefix);
 $methods = get_class_methods($className);
 $result = 1;
 foreach($methods as $methodName)
 {
 $result &= $this->registerMethod($object, $methodName, $prefix . $methodName);
 }
 return (bool)$result;
 }
 
 /**
 * Register class
 * @param string $className Class with static methods to be registered as API handlers
 * @param string $prefix Prefix for object and class methods (use '$' to insert class name)
 * @return bool
 */
 function registerClass($className, $prefix = '')
 {
 if(!class_exists($className)) return false;
 $prefix = str_replace('$', $className, $prefix);
 $methods = get_class_methods($className);
 $result = 1;
 foreach($methods as $methodName)
 {
 $result &= $this->registerStatic($className, $methodName, $prefix . $methodName);
 }
 return (bool)$result;
 }
 
 /**
 * Register classes that implement QAPI_Interface
 * @param string $prefix Prefix for object and class methods (use '$' to insert class name)
 * @return bool
 */
 function registerClasses($prefix = '')
 {
 $classes = get_declared_classes();
 $result = 1;
 foreach($classes as $className)
 {
 if(in_array('QAPI_Interface', class_implements($className)))
 {
 $result &= $this->registerClass($className, $prefix);
 }
 }
 return (bool)$result;
 }
 
 /**
 * Register global objects that implement QAPI_Interface
 * @param string $prefix Prefix for object and class methods (use '$' to insert class name)
 * @return bool
 */
 function registerObjects($prefix = '')
 {
 $objects = $GLOBALS;
 $result = 1;
 foreach($objects as $object)
 {
 if(in_array('QAPI_Interface', class_implements(get_class($object))))
 {
 $result &= $this->registerObject($object, $prefix);
 }
 }
 return (bool)$result;
 }
 
 /**
 * Auto-recognize and register API handler(s)
 * @param object|string|array $handler Object, class or callable to be registered
 * @param string $prefix Prefix for object and class methods (use '$' to insert class name)
 * @return bool
 */
 function register($handler = null, $prefix = '')
 {
 if($handler === null)
 {
 return $this->registerClasses($prefix);
 }
 if(is_object($handler))
 return $this->registerObject($handler, $prefix);
 elseif(class_exists((string)$handler))
 return $this->registerClass($handler, $prefix);
 elseif(is_callable($handler))
 return $this->registerFunction($handler);
 else
 return false;
 }
 
 /**
 * Call registered method
 * @param string $name API method name
 * @return string
 */
 function call($name)
 {
 return $this->__call($name, $this->getParams());
 }
 
 /**
 * Magic wrapper for call method
 * @ignore
 */
 function __call($name, $params)
 {
 $name = strtolower($name);
 return isset($this->methods[$name]) ? $this->dataToString(call_user_func_array($this->methods[$name], $params)) : null;
 }
 
 /**
 * Serialize formed array of registered methods
 * @ignore
 */
 function serialize()
 {
 return serialize($this->methods);
 }
 
 /**
 * Unserialize methods
 * @ignore
 */
 function unserialize($methods)
 {
 $this->methods = unserialize($methods);
 }
 
 /**
 * Wrapper for converting result to string (JSON here, may be overridden in descendant class)
 * @param mixed $result Data to be converted
 * @return string
 */
 function dataToString($result)
 {
 return json_encode($result);
 }
 
 /**
 * Wrapper for getting params for method being called (URI 'params' value here, may be overridden in descendant class)
 * @return array
 */
 function getParams()
 {
 return $_GET['params'];
 }
 }
 |