source: sourcecode/system/libraries/Driver.php @ 1

Last change on this file since 1 was 1, checked in by dungnv, 11 years ago
File size: 5.3 KB
Line 
1<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
2/**
3 * CodeIgniter
4 *
5 * An open source application development framework for PHP 5.1.6 or newer
6 *
7 * @package             CodeIgniter
8 * @author              EllisLab Dev Team
9 * @copyright   Copyright (c) 2006 - 2012, EllisLab, Inc.
10 * @license             http://codeigniter.com/user_guide/license.html
11 * @link                http://codeigniter.com
12 * @since               Version 1.0
13 * @filesource
14 */
15
16// ------------------------------------------------------------------------
17
18/**
19 * CodeIgniter Driver Library Class
20 *
21 * This class enables you to create "Driver" libraries that add runtime ability
22 * to extend the capabilities of a class via additional driver objects
23 *
24 * @package             CodeIgniter
25 * @subpackage  Libraries
26 * @category    Libraries
27 * @author              EllisLab Dev Team
28 * @link
29 */
30class CI_Driver_Library {
31
32        protected $valid_drivers        = array();
33        protected $lib_name;
34
35        // The first time a child is used it won't exist, so we instantiate it
36        // subsequents calls will go straight to the proper child.
37        function __get($child)
38        {
39                if ( ! isset($this->lib_name))
40                {
41                        $this->lib_name = get_class($this);
42                }
43
44                // The class will be prefixed with the parent lib
45                $child_class = $this->lib_name.'_'.$child;
46       
47                // Remove the CI_ prefix and lowercase
48                $lib_name = ucfirst(strtolower(str_replace('CI_', '', $this->lib_name)));
49                $driver_name = strtolower(str_replace('CI_', '', $child_class));
50               
51                if (in_array($driver_name, array_map('strtolower', $this->valid_drivers)))
52                {
53                        // check and see if the driver is in a separate file
54                        if ( ! class_exists($child_class))
55                        {
56                                // check application path first
57                                foreach (get_instance()->load->get_package_paths(TRUE) as $path)
58                                {
59                                        // loves me some nesting!
60                                        foreach (array(ucfirst($driver_name), $driver_name) as $class)
61                                        {
62                                                $filepath = $path.'libraries/'.$lib_name.'/drivers/'.$class.'.php';
63
64                                                if (file_exists($filepath))
65                                                {
66                                                        include_once $filepath;
67                                                        break;
68                                                }
69                                        }
70                                }
71
72                                // it's a valid driver, but the file simply can't be found
73                                if ( ! class_exists($child_class))
74                                {
75                                        log_message('error', "Unable to load the requested driver: ".$child_class);
76                                        show_error("Unable to load the requested driver: ".$child_class);
77                                }
78                        }
79
80                        $obj = new $child_class;
81                        $obj->decorate($this);
82                        $this->$child = $obj;
83                        return $this->$child;
84                }
85
86                // The requested driver isn't valid!
87                log_message('error', "Invalid driver requested: ".$child_class);
88                show_error("Invalid driver requested: ".$child_class);
89        }
90
91        // --------------------------------------------------------------------
92
93}
94// END CI_Driver_Library CLASS
95
96
97/**
98 * CodeIgniter Driver Class
99 *
100 * This class enables you to create drivers for a Library based on the Driver Library.
101 * It handles the drivers' access to the parent library
102 *
103 * @package             CodeIgniter
104 * @subpackage  Libraries
105 * @category    Libraries
106 * @author              EllisLab Dev Team
107 * @link
108 */
109class CI_Driver {
110        protected $parent;
111
112        private $methods = array();
113        private $properties = array();
114
115        private static $reflections = array();
116
117        /**
118         * Decorate
119         *
120         * Decorates the child with the parent driver lib's methods and properties
121         *
122         * @param       object
123         * @return      void
124         */
125        public function decorate($parent)
126        {
127                $this->parent = $parent;
128
129                // Lock down attributes to what is defined in the class
130                // and speed up references in magic methods
131
132                $class_name = get_class($parent);
133
134                if ( ! isset(self::$reflections[$class_name]))
135                {
136                        $r = new ReflectionObject($parent);
137
138                        foreach ($r->getMethods() as $method)
139                        {
140                                if ($method->isPublic())
141                                {
142                                        $this->methods[] = $method->getName();
143                                }
144                        }
145
146                        foreach ($r->getProperties() as $prop)
147                        {
148                                if ($prop->isPublic())
149                                {
150                                        $this->properties[] = $prop->getName();
151                                }
152                        }
153
154                        self::$reflections[$class_name] = array($this->methods, $this->properties);
155                }
156                else
157                {
158                        list($this->methods, $this->properties) = self::$reflections[$class_name];
159                }
160        }
161
162        // --------------------------------------------------------------------
163
164        /**
165         * __call magic method
166         *
167         * Handles access to the parent driver library's methods
168         *
169         * @access      public
170         * @param       string
171         * @param       array
172         * @return      mixed
173         */
174        public function __call($method, $args = array())
175        {
176                if (in_array($method, $this->methods))
177                {
178                        return call_user_func_array(array($this->parent, $method), $args);
179                }
180
181                $trace = debug_backtrace();
182                _exception_handler(E_ERROR, "No such method '{$method}'", $trace[1]['file'], $trace[1]['line']);
183                exit;
184        }
185
186        // --------------------------------------------------------------------
187
188        /**
189         * __get magic method
190         *
191         * Handles reading of the parent driver library's properties
192         *
193         * @param       string
194         * @return      mixed
195         */
196        public function __get($var)
197        {
198                if (in_array($var, $this->properties))
199                {
200                        return $this->parent->$var;
201                }
202        }
203
204        // --------------------------------------------------------------------
205
206        /**
207         * __set magic method
208         *
209         * Handles writing to the parent driver library's properties
210         *
211         * @param       string
212         * @param       array
213         * @return      mixed
214         */
215        public function __set($var, $val)
216        {
217                if (in_array($var, $this->properties))
218                {
219                        $this->parent->$var = $val;
220                }
221        }
222
223        // --------------------------------------------------------------------
224
225}
226// END CI_Driver CLASS
227
228/* End of file Driver.php */
229/* Location: ./system/libraries/Driver.php */
Note: See TracBrowser for help on using the repository browser.