/lenasys/trunk

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/lenasys/trunk

« back to all changes in this revision

Viewing changes to codeigniter/system/libraries/Driver.php

  • Committer: galaxyAbstractor
  • Date: 2013-04-10 15:58:59 UTC
  • mfrom: (20.1.1 lenasys)
  • mto: This revision was merged to the branch mainline in revision 23.
  • Revision ID: galaxyabstractor@gmail.com-20130410155859-cih60kaz5es8savt
CodeIgniter implementation of basic CMS system

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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 */
 
 
b'\\ No newline at end of file'