Remove file execution permission.
[living-lab-site.git] / system / libraries / Driver.php
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 - 2011, 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  */
30 class CI_Driver_Library {
31
32         protected $valid_drivers        = array();
33         protected static $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 = strtolower(preg_replace('/^CI_/', '', $this->lib_name));
49                 $driver_name = strtolower(preg_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 (array(APPPATH, BASEPATH) 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.EXT;
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  */
109 class 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 */