OSDN Git Service

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