/lenasys/trunk

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/lenasys/trunk
20.1.1 by galaxyAbstractor
* Added an simple admin panel to the codeviewer-cmssy stuff
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
 */
30
class 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
 */
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 */