summaryrefslogtreecommitdiffstats
path: root/system
diff options
context:
space:
mode:
authorDerek Jones <derek.jones@ellislab.com>2010-03-05 20:01:44 +0100
committerDerek Jones <derek.jones@ellislab.com>2010-03-05 20:01:44 +0100
commit8dca04163a79701021043fcd3e267a5d965af993 (patch)
treefaca3e3e1d3ac1f83dba692177ab00c02f060413 /system
parentb8354c1e8c85399697af2d8ffd3584095594bba2 (diff)
added Driver lib
Diffstat (limited to 'system')
-rw-r--r--system/core/Loader.php23
-rw-r--r--system/libraries/Driver.php232
2 files changed, 255 insertions, 0 deletions
diff --git a/system/core/Loader.php b/system/core/Loader.php
index f70ee0334..c399f296d 100644
--- a/system/core/Loader.php
+++ b/system/core/Loader.php
@@ -544,6 +544,29 @@ class CI_Loader {
// --------------------------------------------------------------------
/**
+ * Driver
+ *
+ * Loads a driver library
+ *
+ * @param string the name of the class
+ * @param mixed the optional parameters
+ * @param string an optional object name
+ * @return void
+ */
+ function driver($library = '', $params = NULL, $object_name = NULL)
+ {
+ if ( ! class_exists('CI_Driver_Library'))
+ {
+ // we aren't instantiating an object here, that'll be done by the Library itself
+ require_once BASEPATH.'libraries/Driver'.EXT;
+ }
+
+ return $this->library($library, $params, $object_name);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
* Add Package Path
*
* Prepends a parent path to the library, model, helper, and config path arrays
diff --git a/system/libraries/Driver.php b/system/libraries/Driver.php
new file mode 100644
index 000000000..07ef2e724
--- /dev/null
+++ b/system/libraries/Driver.php
@@ -0,0 +1,232 @@
+<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author EllisLab Dev Team
+ * @copyright Copyright (c) 2006 - 2010, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * CodeIgniter Driver Library Class
+ *
+ * This class enables you to create "Driver" libraries that add runtime ability
+ * to extend the capabilities of a class via additional driver objects
+ *
+ * @package CodeIgniter
+ * @subpackage Libraries
+ * @category Libraries
+ * @author EllisLab Dev Team
+ * @link
+ */
+class CI_Driver_Library {
+
+ protected $valid_drivers = array();
+ protected static $lib_name;
+
+ // The first time a child is used it won't exist, so we instantiate it
+ // subsequents calls will go straight to the proper child.
+ function __get($child)
+ {
+ if (! isset($this->lib_name))
+ {
+ $this->lib_name = get_class($this);
+ }
+
+ // The class will be prefixed with the parent lib
+ $child_class = $this->lib_name.'_'.$child;
+
+ if (in_array(strtolower($child_class), array_map('strtolower', $this->valid_drivers)))
+ {
+ // check and see if the driver is in a separate file
+ if ( ! class_exists($child_class))
+ {
+ // check application path first
+ foreach (array(APPPATH, BASEPATH) as $path)
+ {
+ // and check for case sensitivity of both the parent and child libs
+ foreach (array(ucfirst($this->lib_name), strtolower($this->lib_name)) as $lib)
+ {
+ // loves me some nesting!
+ foreach (array(ucfirst($child_class), strtolower($child_class)) as $class)
+ {
+ $filepath = $path.'libraries/'.$this->lib_name.'/drivers/'.$child_class.EXT;
+
+ if (file_exists($filepath))
+ {
+ include_once $filepath;
+ break;
+ }
+ }
+ }
+ }
+
+ // it's a valid driver, but the file simply can't be found
+ if ( ! class_exists($child_class))
+ {
+ log_message('error', "Unable to load the requested driver: ".$child_class);
+ show_error("Unable to load the requested driver: ".$child_class);
+ }
+ }
+
+ $obj = new $child_class;
+ $obj->decorate($this);
+ $this->$child = $obj;
+ return $this->$child;
+ }
+
+ // The requested driver isn't valid!
+ log_message('error', "Invalid driver requested: ".$child_class);
+ show_error("Invalid driver requested: ".$child_class);
+ }
+
+ // --------------------------------------------------------------------
+
+}
+// END CI_Driver_Library CLASS
+
+
+/**
+ * CodeIgniter Driver Class
+ *
+ * This class enables you to create drivers for a Library based on the Driver Library.
+ * It handles the drivers' access to the parent library
+ *
+ * @package CodeIgniter
+ * @subpackage Libraries
+ * @category Libraries
+ * @author EllisLab Dev Team
+ * @link
+ */
+class CI_Driver {
+ protected $parent;
+
+ private $methods = array();
+ private $properties = array();
+
+ private static $reflections = array();
+
+ /**
+ * Decorate
+ *
+ * Decorates the child with the parent driver lib's methods and properties
+ *
+ * @access public
+ * @param object
+ * @return void
+ */
+ function decorate($parent)
+ {
+ $this->parent = $parent;
+
+ // Lock down attributes to what is defined in the class
+ // and speed up references in magic methods
+
+ $class_name = get_class($parent);
+
+ if ( ! isset(self::$reflections[$class_name]))
+ {
+ $r = new ReflectionObject($parent);
+
+ foreach ($r->getMethods() as $method)
+ {
+ if ($method->isPublic())
+ {
+ $this->methods[] = $method->getName();
+ }
+ }
+
+ foreach($r->getProperties() as $prop)
+ {
+ if ($prop->isPublic())
+ {
+ $this->properties[] = $prop->getName();
+ }
+ }
+
+ self::$reflections[$class_name] = array($this->methods, $this->properties);
+ }
+ else
+ {
+ list($this->methods, $this->properties) = self::$reflections[$class_name];
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * __call magic method
+ *
+ * Handles access to the parent driver library's methods
+ *
+ * @access public
+ * @param string
+ * @param array
+ * @return mixed
+ */
+ public function __call($method, $args = array())
+ {
+ if (in_array($method, $this->methods))
+ {
+ return call_user_func_array(array($this->parent, $method), $args);
+ }
+
+ $trace = debug_backtrace();
+ _exception_handler(E_ERROR, "No such method '{$method}'", $trace[1]['file'], $trace[1]['line']);
+ exit;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * __get magic method
+ *
+ * Handles reading of the parent driver library's properties
+ *
+ * @access public
+ * @param string
+ * @return mixed
+ */
+ function __get($var)
+ {
+ if (in_array($var, $this->properties))
+ {
+ return $this->parent->$var;
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * __set magic method
+ *
+ * Handles writing to the parent driver library's properties
+ *
+ * @access public
+ * @param string
+ * @param array
+ * @return mixed
+ */
+ function __set($var, $val)
+ {
+ if (in_array($var, $this->properties))
+ {
+ $this->parent->$var = $val;
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+}
+// END CI_Driver CLASS
+
+/* End of file Driver.php */
+/* Location: ./system/libraries/Driver.php */ \ No newline at end of file