OSDN Git Service

- Ethna_UrlHandlerクラスを追加(ステキurl対応)
[ethna/ethna.git] / Ethna.php
1 <?php
2 // vim: foldmethod=marker
3 /**
4  *  Ethna.php
5  *
6  *  @author     Masaki Fujimoto <fujimoto@php.net>
7  *  @license    http://www.opensource.org/licenses/bsd-license.php The BSD License
8  *  @package    Ethna
9  *  @version    $Id$
10  */
11
12 /** Ethna depends on PEAR */
13 include_once('PEAR.php');
14
15 if (!defined('PATH_SEPARATOR')) {
16     if (OS_WINDOWS) {
17         /** include_path separator(Windows) */
18         define('PATH_SEPARATOR', ';');
19     } else {
20         /** include_path separator(Unix) */
21         define('PATH_SEPARATOR', ':');
22     }
23 }
24 if (!defined('DIRECTORY_SEPARATOR')) {
25     if (OS_WINDOWS) {
26         /** directory separator(Windows) */
27         define('DIRECTORY_SEPARATOR', '\\');
28     } else {
29         /** separator(Unix) */
30         define('DIRECTORY_SEPARATOR', '/');
31     }
32 }
33
34 /** ¥Ð¡¼¥¸¥ç¥óÄêµÁ */
35 define('ETHNA_VERSION', '2.3.0-dev');
36
37 /** Ethna¥Ù¡¼¥¹¥Ç¥£¥ì¥¯¥È¥êÄêµÁ */
38 define('ETHNA_BASE', dirname(__FILE__));
39
40 include_once(ETHNA_BASE . '/class/Ethna_ActionClass.php');
41 include_once(ETHNA_BASE . '/class/Ethna_ActionError.php');
42 include_once(ETHNA_BASE . '/class/Ethna_ActionForm.php');
43 include_once(ETHNA_BASE . '/class/Ethna_AppManager.php');
44 include_once(ETHNA_BASE . '/class/Ethna_AppObject.php');
45 include_once(ETHNA_BASE . '/class/Ethna_AppSQL.php');
46 include_once(ETHNA_BASE . '/class/Ethna_AppSearchObject.php');
47 include_once(ETHNA_BASE . '/class/Ethna_Backend.php');
48 include_once(ETHNA_BASE . '/class/Ethna_CacheManager.php');
49 include_once(ETHNA_BASE . '/class/Ethna_Config.php');
50 include_once(ETHNA_BASE . '/class/Ethna_Controller.php');
51 include_once(ETHNA_BASE . '/class/Ethna_ClassFactory.php');
52 include_once(ETHNA_BASE . '/class/Ethna_DB.php');
53 include_once(ETHNA_BASE . '/class/DB/Ethna_DB_PEAR.php');
54 include_once(ETHNA_BASE . '/class/Ethna_Filter.php');
55 include_once(ETHNA_BASE . '/class/Ethna_Handle.php');
56 include_once(ETHNA_BASE . '/class/Ethna_I18N.php');
57 include_once(ETHNA_BASE . '/class/Ethna_Logger.php');
58 include_once(ETHNA_BASE . '/class/Ethna_MailSender.php');
59 include_once(ETHNA_BASE . '/class/Ethna_Session.php');
60 include_once(ETHNA_BASE . '/class/Ethna_Generator.php');
61 include_once(ETHNA_BASE . '/class/Ethna_SmartyPlugin.php');
62 include_once(ETHNA_BASE . '/class/Ethna_UrlHandler.php');
63 include_once(ETHNA_BASE . '/class/Ethna_Util.php');
64 include_once(ETHNA_BASE . '/class/Ethna_ViewClass.php');
65 include_once(ETHNA_BASE . '/class/View/Ethna_View_List.php');
66 include_once(ETHNA_BASE . '/class/Ethna_Plugin.php');
67 include_once(ETHNA_BASE . '/class/Ethna_Renderer.php');
68 include_once(ETHNA_BASE . '/class/Renderer/Ethna_Renderer_Smarty.php');
69 include_once(ETHNA_BASE . '/class/CLI/Ethna_CLI_ActionClass.php');
70
71 if (extension_loaded('soap')) {
72     include_once(ETHNA_BASE . '/class/SOAP/Ethna_SOAP_ActionForm.php');
73     include_once(ETHNA_BASE . '/class/SOAP/Ethna_SOAP_Gateway.php');
74     include_once(ETHNA_BASE . '/class/SOAP/Ethna_SOAP_GatewayGenerator.php');
75     include_once(ETHNA_BASE . '/class/SOAP/Ethna_SOAP_Util.php');
76     include_once(ETHNA_BASE . '/class/SOAP/Ethna_SOAP_WsdlGenerator.php');
77 }
78
79 /** ¥¯¥é¥¤¥¢¥ó¥È¸À¸ìÄêµÁ: ±Ñ¸ì */
80 define('LANG_EN', 'en');
81
82 /** ¥¯¥é¥¤¥¢¥ó¥È¸À¸ìÄêµÁ: ÆüËܸì */
83 define('LANG_JA', 'ja');
84
85
86 /** ¥²¡¼¥È¥¦¥§¥¤: WWW */
87 define('GATEWAY_WWW', 1);
88
89 /** ¥²¡¼¥È¥¦¥§¥¤: CLI */
90 define('GATEWAY_CLI', 2);
91
92 /** ¥²¡¼¥È¥¦¥§¥¤: XMLRPC */
93 define('GATEWAY_XMLRPC', 3);
94
95 /** ¥²¡¼¥È¥¦¥§¥¤: SOAP */
96 define('GATEWAY_SOAP', 4);
97
98
99 /** DB¼ïÊÌÄêµÁ: R/W */
100 define('DB_TYPE_RW', 1);
101
102 /** DB¼ïÊÌÄêµÁ: R/O */
103 define('DB_TYPE_RO', 2);
104
105 /** DB¼ïÊÌÄêµÁ: Misc  */
106 define('DB_TYPE_MISC', 3);
107
108
109 /** Í×ÁÇ·¿: À°¿ô */
110 define('VAR_TYPE_INT', 1);
111
112 /** Í×ÁÇ·¿: ÉâÆ°¾®¿ôÅÀ¿ô */
113 define('VAR_TYPE_FLOAT', 2);
114
115 /** Í×ÁÇ·¿: Ê¸»úÎó */
116 define('VAR_TYPE_STRING', 3);
117
118 /** Í×ÁÇ·¿: ÆüÉÕ */
119 define('VAR_TYPE_DATETIME', 4);
120
121 /** Í×ÁÇ·¿: ¿¿µ¶ÃÍ */
122 define('VAR_TYPE_BOOLEAN', 5);
123
124 /** Í×ÁÇ·¿: ¥Õ¥¡¥¤¥ë */
125 define('VAR_TYPE_FILE', 6);
126
127
128 /** ¥Õ¥©¡¼¥à·¿: text */
129 define('FORM_TYPE_TEXT', 1);
130
131 /** ¥Õ¥©¡¼¥à·¿: password */
132 define('FORM_TYPE_PASSWORD', 2);
133
134 /** ¥Õ¥©¡¼¥à·¿: textarea */
135 define('FORM_TYPE_TEXTAREA', 3);
136
137 /** ¥Õ¥©¡¼¥à·¿: select */
138 define('FORM_TYPE_SELECT', 4);
139
140 /** ¥Õ¥©¡¼¥à·¿: radio */
141 define('FORM_TYPE_RADIO', 5);
142
143 /** ¥Õ¥©¡¼¥à·¿: checkbox */
144 define('FORM_TYPE_CHECKBOX', 6);
145
146 /** ¥Õ¥©¡¼¥à·¿: button */
147 define('FORM_TYPE_SUBMIT', 7);
148
149 /** ¥Õ¥©¡¼¥à·¿: file */
150 define('FORM_TYPE_FILE', 8);
151
152 /** ¥Õ¥©¡¼¥à·¿: button */
153 define('FORM_TYPE_BUTTON', 9);
154
155 /** ¥Õ¥©¡¼¥à·¿: hidden */
156 define('FORM_TYPE_HIDDEN', 10);
157
158
159 /** ¥¨¥é¡¼¥³¡¼¥É: °ìÈÌ¥¨¥é¡¼ */
160 define('E_GENERAL', 1);
161
162 /** ¥¨¥é¡¼¥³¡¼¥É: DBÀܳ¥¨¥é¡¼ */
163 define('E_DB_CONNECT', 2);
164
165 /** ¥¨¥é¡¼¥³¡¼¥É: DBÀßÄê¤Ê¤· */
166 define('E_DB_NODSN', 3);
167
168 /** ¥¨¥é¡¼¥³¡¼¥É: DB¥¯¥¨¥ê¥¨¥é¡¼ */
169 define('E_DB_QUERY', 4);
170
171 /** ¥¨¥é¡¼¥³¡¼¥É: DB¥æ¥Ë¡¼¥¯¥­¡¼¥¨¥é¡¼ */
172 define('E_DB_DUPENT', 5);
173
174 /** ¥¨¥é¡¼¥³¡¼¥É: DB¼ïÊÌ¥¨¥é¡¼ */
175 define('E_DB_INVALIDTYPE', 6);
176
177 /** ¥¨¥é¡¼¥³¡¼¥É: ¥»¥Ã¥·¥ç¥ó¥¨¥é¡¼(Í­¸ú´ü¸ÂÀÚ¤ì) */
178 define('E_SESSION_EXPIRE', 16);
179
180 /** ¥¨¥é¡¼¥³¡¼¥É: ¥»¥Ã¥·¥ç¥ó¥¨¥é¡¼(IP¥¢¥É¥ì¥¹¥Á¥§¥Ã¥¯¥¨¥é¡¼) */
181 define('E_SESSION_IPCHECK', 17);
182
183 /** ¥¨¥é¡¼¥³¡¼¥É: ¥¢¥¯¥·¥ç¥ó̤ÄêµÁ¥¨¥é¡¼ */
184 define('E_APP_UNDEFINED_ACTION', 32);
185
186 /** ¥¨¥é¡¼¥³¡¼¥É: ¥¢¥¯¥·¥ç¥ó¥¯¥é¥¹Ì¤ÄêµÁ¥¨¥é¡¼ */
187 define('E_APP_UNDEFINED_ACTIONCLASS', 33);
188
189 /** ¥¨¥é¡¼¥³¡¼¥É: ¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥ª¥Ö¥¸¥§¥¯¥ÈID½ÅÊ£¥¨¥é¡¼ */
190 define('E_APP_DUPENT', 34);
191
192 /** ¥¨¥é¡¼¥³¡¼¥É: ¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥á¥½¥Ã¥É¤¬Â¸ºß¤·¤Ê¤¤ */
193 define('E_APP_NOMETHOD', 35);
194
195 /** ¥¨¥é¡¼¥³¡¼¥É: ¥í¥Ã¥¯¥¨¥é¡¼ */
196 define('E_APP_LOCK', 36);
197
198 /** ¥¨¥é¡¼¥³¡¼¥É: CSVʬ³ä¥¨¥é¡¼(¹Ô·Ñ³) */
199 define('E_UTIL_CSV_CONTINUE', 64);
200
201 /** ¥¨¥é¡¼¥³¡¼¥É: ¥Õ¥©¡¼¥àÃÍ·¿¥¨¥é¡¼(¥¹¥«¥é¡¼°ú¿ô¤ËÇÛÎó»ØÄê) */
202 define('E_FORM_WRONGTYPE_SCALAR', 128);
203
204 /** ¥¨¥é¡¼¥³¡¼¥É: ¥Õ¥©¡¼¥àÃÍ·¿¥¨¥é¡¼(ÇÛÎó°ú¿ô¤Ë¥¹¥«¥é¡¼»ØÄê) */
205 define('E_FORM_WRONGTYPE_ARRAY', 129);
206
207 /** ¥¨¥é¡¼¥³¡¼¥É: ¥Õ¥©¡¼¥àÃÍ·¿¥¨¥é¡¼(À°¿ô·¿) */
208 define('E_FORM_WRONGTYPE_INT', 130);
209
210 /** ¥¨¥é¡¼¥³¡¼¥É: ¥Õ¥©¡¼¥àÃÍ·¿¥¨¥é¡¼(ÉâÆ°¾®¿ôÅÀ¿ô·¿) */
211 define('E_FORM_WRONGTYPE_FLOAT', 131);
212
213 /** ¥¨¥é¡¼¥³¡¼¥É: ¥Õ¥©¡¼¥àÃÍ·¿¥¨¥é¡¼(ÆüÉÕ·¿) */
214 define('E_FORM_WRONGTYPE_DATETIME', 132);
215
216 /** ¥¨¥é¡¼¥³¡¼¥É: ¥Õ¥©¡¼¥àÃÍ·¿¥¨¥é¡¼(BOOL·¿) */
217 define('E_FORM_WRONGTYPE_BOOLEAN', 133);
218
219 /** ¥¨¥é¡¼¥³¡¼¥É: ¥Õ¥©¡¼¥àÃÍ·¿¥¨¥é¡¼(FILE·¿) */
220 define('E_FORM_WRONGTYPE_FILE', 134);
221
222 /** ¥¨¥é¡¼¥³¡¼¥É: ¥Õ¥©¡¼¥àÃÍɬ¿Ü¥¨¥é¡¼ */
223 define('E_FORM_REQUIRED', 135);
224
225 /** ¥¨¥é¡¼¥³¡¼¥É: ¥Õ¥©¡¼¥àÃͺǾ®ÃÍ¥¨¥é¡¼(À°¿ô·¿) */
226 define('E_FORM_MIN_INT', 136);
227
228 /** ¥¨¥é¡¼¥³¡¼¥É: ¥Õ¥©¡¼¥àÃͺǾ®ÃÍ¥¨¥é¡¼(ÉâÆ°¾®¿ôÅÀ¿ô·¿) */
229 define('E_FORM_MIN_FLOAT', 137);
230
231 /** ¥¨¥é¡¼¥³¡¼¥É: ¥Õ¥©¡¼¥àÃͺǾ®ÃÍ¥¨¥é¡¼(ʸ»úÎó·¿) */
232 define('E_FORM_MIN_STRING', 138);
233
234 /** ¥¨¥é¡¼¥³¡¼¥É: ¥Õ¥©¡¼¥àÃͺǾ®ÃÍ¥¨¥é¡¼(ÆüÉÕ·¿) */
235 define('E_FORM_MIN_DATETIME', 139);
236
237 /** ¥¨¥é¡¼¥³¡¼¥É: ¥Õ¥©¡¼¥àÃͺǾ®ÃÍ¥¨¥é¡¼(¥Õ¥¡¥¤¥ë·¿) */
238 define('E_FORM_MIN_FILE', 140);
239
240 /** ¥¨¥é¡¼¥³¡¼¥É: ¥Õ¥©¡¼¥àÃͺÇÂçÃÍ¥¨¥é¡¼(À°¿ô·¿) */
241 define('E_FORM_MAX_INT', 141);
242
243 /** ¥¨¥é¡¼¥³¡¼¥É: ¥Õ¥©¡¼¥àÃͺÇÂçÃÍ¥¨¥é¡¼(ÉâÆ°¾®¿ôÅÀ¿ô·¿) */
244 define('E_FORM_MAX_FLOAT', 142);
245
246 /** ¥¨¥é¡¼¥³¡¼¥É: ¥Õ¥©¡¼¥àÃͺÇÂçÃÍ¥¨¥é¡¼(ʸ»úÎó·¿) */
247 define('E_FORM_MAX_STRING', 143);
248
249 /** ¥¨¥é¡¼¥³¡¼¥É: ¥Õ¥©¡¼¥àÃͺÇÂçÃÍ¥¨¥é¡¼(ÆüÉÕ·¿) */
250 define('E_FORM_MAX_DATETIME', 144);
251
252 /** ¥¨¥é¡¼¥³¡¼¥É: ¥Õ¥©¡¼¥àÃͺÇÂçÃÍ¥¨¥é¡¼(¥Õ¥¡¥¤¥ë·¿) */
253 define('E_FORM_MAX_FILE', 145);
254
255 /** ¥¨¥é¡¼¥³¡¼¥É: ¥Õ¥©¡¼¥àÃÍʸ»ú¼ï(Àµµ¬É½¸½)¥¨¥é¡¼ */
256 define('E_FORM_REGEXP', 146);
257
258 /** ¥¨¥é¡¼¥³¡¼¥É: ¥Õ¥©¡¼¥àÃÍ¿ôÃÍ(¥«¥¹¥¿¥à¥Á¥§¥Ã¥¯)¥¨¥é¡¼ */
259 define('E_FORM_INVALIDVALUE', 147);
260
261 /** ¥¨¥é¡¼¥³¡¼¥É: ¥Õ¥©¡¼¥àÃÍʸ»ú¼ï(¥«¥¹¥¿¥à¥Á¥§¥Ã¥¯)¥¨¥é¡¼ */
262 define('E_FORM_INVALIDCHAR', 148);
263
264 /** ¥¨¥é¡¼¥³¡¼¥É: ³ÎǧÍÑ¥¨¥ó¥È¥êÆþÎÏ¥¨¥é¡¼ */
265 define('E_FORM_CONFIRM', 149);
266
267 /** ¥¨¥é¡¼¥³¡¼¥É: ¥­¥ã¥Ã¥·¥å¥¿¥¤¥×ÉÔÀµ */
268 define('E_CACHE_INVALID_TYPE', 192);
269
270 /** ¥¨¥é¡¼¥³¡¼¥É: ¥­¥ã¥Ã¥·¥åÃͤʤ· */
271 define('E_CACHE_NO_VALUE', 193);
272
273 /** ¥¨¥é¡¼¥³¡¼¥É: ¥­¥ã¥Ã¥·¥åÍ­¸ú´ü¸Â */
274 define('E_CACHE_EXPIRED', 194);
275
276 /** ¥¨¥é¡¼¥³¡¼¥É: ¥­¥ã¥Ã¥·¥å¥¨¥é¡¼(¤½¤Î¾) */
277 define('E_CACHE_GENERAL', 195);
278
279 /** ¥¨¥é¡¼¥³¡¼¥É: ¥×¥é¥°¥¤¥ó¤¬¸«¤Ä¤«¤é¤Ê¤¤ */
280 define('E_PLUGIN_NOTFOUND', 196);
281
282 /** ¥¨¥é¡¼¥³¡¼¥É: ¥×¥é¥°¥¤¥ó¥¨¥é¡¼(¤½¤Î¾) */
283 define('E_PLUGIN_GENERAL', 197);
284
285 if (defined('E_STRICT') == false) {
286     /** PHP 5¤È¤Î¸ß´¹ÊÝ»ýÄêµÁ */
287     define('E_STRICT', 0);
288 }
289
290 /** Ethna¥°¥í¡¼¥Ð¥ëÊÑ¿ô: ¥¨¥é¡¼¥³¡¼¥ë¥Ð¥Ã¥¯´Ø¿ô */
291 $GLOBALS['_Ethna_error_callback_list'] = array();
292
293 /** Ethna¥°¥í¡¼¥Ð¥ëÊÑ¿ô: ¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸ */
294 $GLOBALS['_Ethna_error_message_list'] = array();
295
296
297 // {{{ Ethna
298 /**
299  *  Ethna¥Õ¥ì¡¼¥à¥ï¡¼¥¯¥¯¥é¥¹
300  *
301  *  @author     Masaki Fujimoto <fujimoto@php.net>
302  *  @access     public
303  *  @package    Ethna
304  */
305 class Ethna extends PEAR
306 {
307     /**#@+
308      *  @access private
309      */
310
311     /**#@-*/
312
313     /**
314      *  Ethna_Error¥ª¥Ö¥¸¥§¥¯¥È¤òÀ¸À®¤¹¤ë(¥¨¥é¡¼¥ì¥Ù¥ë:E_USER_ERROR)
315      *
316      *  @access public
317      *  @param  string  $message            ¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸
318      *  @param  int     $code               ¥¨¥é¡¼¥³¡¼¥É
319      *  @static
320      */
321     function &raiseError($message, $code = E_GENERAL)
322     {
323         $userinfo = null;
324         if (func_num_args() > 2) {
325             $userinfo = array_slice(func_get_args(), 2);
326             if (count($userinfo) == 1 && is_array($userinfo[0])) {
327                 $userinfo = $userinfo[0];
328             }
329         }
330         return PEAR::raiseError($message, $code, PEAR_ERROR_RETURN, E_USER_ERROR, $userinfo, 'Ethna_Error');
331     }
332
333     /**
334      *  Ethna_Error¥ª¥Ö¥¸¥§¥¯¥È¤òÀ¸À®¤¹¤ë(¥¨¥é¡¼¥ì¥Ù¥ë:E_USER_WARNING)
335      *
336      *  @access public
337      *  @param  string  $message            ¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸
338      *  @param  int     $code               ¥¨¥é¡¼¥³¡¼¥É
339      *  @static
340      */
341     function &raiseWarning($message, $code = E_GENERAL)
342     {
343         $userinfo = null;
344         if (func_num_args() > 2) {
345             $userinfo = array_slice(func_get_args(), 2);
346             if (count($userinfo) == 1 && is_array($userinfo[0])) {
347                 $userinfo = $userinfo[0];
348             }
349         }
350         return PEAR::raiseError($message, $code, PEAR_ERROR_RETURN, E_USER_WARNING, $userinfo, 'Ethna_Error');
351     }
352
353     /**
354      *  Ethna_Error¥ª¥Ö¥¸¥§¥¯¥È¤òÀ¸À®¤¹¤ë(¥¨¥é¡¼¥ì¥Ù¥ë:E_USER_NOTICE)
355      *
356      *  @access public
357      *  @param  string  $message            ¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸
358      *  @param  int     $code               ¥¨¥é¡¼¥³¡¼¥É
359      *  @static
360      */
361     function &raiseNotice($message, $code = E_GENERAL)
362     {
363         $userinfo = null;
364         if (func_num_args() > 2) {
365             $userinfo = array_slice(func_get_args(), 2);
366             if (count($userinfo) == 1 && is_array($userinfo[0])) {
367                 $userinfo = $userinfo[0];
368             }
369         }
370         return PEAR::raiseError($message, $code, PEAR_ERROR_RETURN, E_USER_NOTICE, $userinfo, 'Ethna_Error');
371     }
372
373     /**
374      *  ¥¨¥é¡¼È¯À¸»þ¤Î(¥Õ¥ì¡¼¥à¥ï¡¼¥¯¤È¤·¤Æ¤Î)¥³¡¼¥ë¥Ð¥Ã¥¯´Ø¿ô¤òÀßÄꤹ¤ë
375      *
376      *  @access public
377      *  @param  mixed   string:¥³¡¼¥ë¥Ð¥Ã¥¯´Ø¿ô̾ array:¥³¡¼¥ë¥Ð¥Ã¥¯¥¯¥é¥¹(̾|¥ª¥Ö¥¸¥§¥¯¥È)+¥á¥½¥Ã¥É̾
378      *  @static
379      */
380     function setErrorCallback($callback)
381     {
382         $GLOBALS['_Ethna_error_callback_list'][] = $callback;
383     }
384
385     /**
386      *  ¥¨¥é¡¼È¯À¸»þ¤Î(¥Õ¥ì¡¼¥à¥ï¡¼¥¯¤È¤·¤Æ¤Î)¥³¡¼¥ë¥Ð¥Ã¥¯´Ø¿ô¤ò¥¯¥ê¥¢¤¹¤ë
387      *
388      *  @access public
389      *  @static
390      */
391     function clearErrorCallback()
392     {
393         $GLOBALS['_Ethna_error_callback_list'] = array();
394     }
395
396     /**
397      *  ¥¨¥é¡¼È¯À¸»þ¤Î½èÍý¤ò¹Ô¤¦(¥³¡¼¥ë¥Ð¥Ã¥¯´Ø¿ô/¥á¥½¥Ã¥É¤ò¸Æ¤Ó½Ð¤¹)
398      *  
399      *  @access public
400      *  @param  object  Ethna_Error     Ethna_Error¥ª¥Ö¥¸¥§¥¯¥È
401      *  @static
402      */
403     function handleError(&$error)
404     {
405         for ($i = 0; $i < count($GLOBALS['_Ethna_error_callback_list']); $i++) {
406             $callback =& $GLOBALS['_Ethna_error_callback_list'][$i];
407             if (is_array($callback) == false) {
408                 call_user_func($callback, $error);
409             } else if (is_object($callback[0])) {
410                 $object =& $callback[0];
411                 $method = $callback[1];
412
413                 // perform some more checks?
414                 $object->$method($error);
415             } else {
416                 call_user_func($callback, $error);
417             }
418         }
419     }
420 }
421 // }}}
422 ?>