_findRootClass($class), 'Adminer')) { //! can use interface $plugins[$class] = new $class; } } } $this->plugins = $plugins; //! it is possible to use ReflectionObject to find out which plugins defines which methods at once } function _callParent($function, $args) { return call_user_func_array(array('parent', $function), $args); } function _applyPlugin($function, $args) { foreach ($this->plugins as $plugin) { if (method_exists($plugin, $function)) { switch (count($args)) { // call_user_func_array() doesn't work well with references case 0: $return = $plugin->$function(); break; case 1: $return = $plugin->$function($args[0]); break; case 2: $return = $plugin->$function($args[0], $args[1]); break; case 3: $return = $plugin->$function($args[0], $args[1], $args[2]); break; case 4: $return = $plugin->$function($args[0], $args[1], $args[2], $args[3]); break; case 5: $return = $plugin->$function($args[0], $args[1], $args[2], $args[3], $args[4]); break; case 6: $return = $plugin->$function($args[0], $args[1], $args[2], $args[3], $args[4], $args[5]); break; default: trigger_error('Too many parameters.', E_USER_WARNING); } if ($return !== null) { return $return; } } } return $this->_callParent($function, $args); } function _appendPlugin($function, $args) { $return = $this->_callParent($function, $args); foreach ($this->plugins as $plugin) { if (method_exists($plugin, $function)) { $return += call_user_func_array(array($plugin, $function), $args); } } return $return; } // appendPlugin function dumpFormat() { $args = func_get_args(); return $this->_appendPlugin(__FUNCTION__, $args); } function dumpOutput() { $args = func_get_args(); return $this->_appendPlugin(__FUNCTION__, $args); } function editFunctions() { $args = func_get_args(); return $this->_appendPlugin(__FUNCTION__, $args); } // applyPlugin function name() { $args = func_get_args(); return $this->_applyPlugin(__FUNCTION__, $args); } function credentials() { $args = func_get_args(); return $this->_applyPlugin(__FUNCTION__, $args); } function permanentLogin() { $args = func_get_args(); return $this->_applyPlugin(__FUNCTION__, $args); } function database() { $args = func_get_args(); return $this->_applyPlugin(__FUNCTION__, $args); } function databases() { $args = func_get_args(); return $this->_applyPlugin(__FUNCTION__, $args); } function queryTimeout() { $args = func_get_args(); return $this->_applyPlugin(__FUNCTION__, $args); } function headers() { $args = func_get_args(); return $this->_applyPlugin(__FUNCTION__, $args); } function head() { $args = func_get_args(); return $this->_applyPlugin(__FUNCTION__, $args); } function loginForm() { $args = func_get_args(); return $this->_applyPlugin(__FUNCTION__, $args); } function login() { $args = func_get_args(); return $this->_applyPlugin(__FUNCTION__, $args); } function tableName() { $args = func_get_args(); return $this->_applyPlugin(__FUNCTION__, $args); } function fieldName() { $args = func_get_args(); return $this->_applyPlugin(__FUNCTION__, $args); } function selectLinks() { $args = func_get_args(); return $this->_applyPlugin(__FUNCTION__, $args); } function foreignKeys() { $args = func_get_args(); return $this->_applyPlugin(__FUNCTION__, $args); } function backwardKeys() { $args = func_get_args(); return $this->_applyPlugin(__FUNCTION__, $args); } function backwardKeysPrint() { $args = func_get_args(); return $this->_applyPlugin(__FUNCTION__, $args); } function selectQuery() { $args = func_get_args(); return $this->_applyPlugin(__FUNCTION__, $args); } function rowDescription() { $args = func_get_args(); return $this->_applyPlugin(__FUNCTION__, $args); } function rowDescriptions() { $args = func_get_args(); return $this->_applyPlugin(__FUNCTION__, $args); } function selectLink() { $args = func_get_args(); return $this->_applyPlugin(__FUNCTION__, $args); } function selectVal() { $args = func_get_args(); return $this->_applyPlugin(__FUNCTION__, $args); } function editVal() { $args = func_get_args(); return $this->_applyPlugin(__FUNCTION__, $args); } function selectColumnsPrint() { $args = func_get_args(); return $this->_applyPlugin(__FUNCTION__, $args); } function selectSearchPrint() { $args = func_get_args(); return $this->_applyPlugin(__FUNCTION__, $args); } function selectOrderPrint() { $args = func_get_args(); return $this->_applyPlugin(__FUNCTION__, $args); } function selectLimitPrint() { $args = func_get_args(); return $this->_applyPlugin(__FUNCTION__, $args); } function selectLengthPrint() { $args = func_get_args(); return $this->_applyPlugin(__FUNCTION__, $args); } function selectActionPrint() { $args = func_get_args(); return $this->_applyPlugin(__FUNCTION__, $args); } function selectCommandPrint() { $args = func_get_args(); return $this->_applyPlugin(__FUNCTION__, $args); } function selectImportPrint() { $args = func_get_args(); return $this->_applyPlugin(__FUNCTION__, $args); } function selectEmailPrint() { $args = func_get_args(); return $this->_applyPlugin(__FUNCTION__, $args); } function selectColumnsProcess() { $args = func_get_args(); return $this->_applyPlugin(__FUNCTION__, $args); } function selectSearchProcess() { $args = func_get_args(); return $this->_applyPlugin(__FUNCTION__, $args); } function selectOrderProcess() { $args = func_get_args(); return $this->_applyPlugin(__FUNCTION__, $args); } function selectLimitProcess() { $args = func_get_args(); return $this->_applyPlugin(__FUNCTION__, $args); } function selectLengthProcess() { $args = func_get_args(); return $this->_applyPlugin(__FUNCTION__, $args); } function selectEmailProcess() { $args = func_get_args(); return $this->_applyPlugin(__FUNCTION__, $args); } function selectQueryBuild() { $args = func_get_args(); return $this->_applyPlugin(__FUNCTION__, $args); } function messageQuery() { $args = func_get_args(); return $this->_applyPlugin(__FUNCTION__, $args); } function editInput() { $args = func_get_args(); return $this->_applyPlugin(__FUNCTION__, $args); } function processInput() { $args = func_get_args(); return $this->_applyPlugin(__FUNCTION__, $args); } function dumpDatabase() { $args = func_get_args(); return $this->_applyPlugin(__FUNCTION__, $args); } function dumpTable() { $args = func_get_args(); return $this->_applyPlugin(__FUNCTION__, $args); } function dumpData() { $args = func_get_args(); return $this->_applyPlugin(__FUNCTION__, $args); } function dumpFilename() { $args = func_get_args(); return $this->_applyPlugin(__FUNCTION__, $args); } function dumpHeaders() { $args = func_get_args(); return $this->_applyPlugin(__FUNCTION__, $args); } function homepage() { $args = func_get_args(); return $this->_applyPlugin(__FUNCTION__, $args); } function navigation() { $args = func_get_args(); return $this->_applyPlugin(__FUNCTION__, $args); } function databasesPrint() { $args = func_get_args(); return $this->_applyPlugin(__FUNCTION__, $args); } function tablesPrint() { $args = func_get_args(); return $this->_applyPlugin(__FUNCTION__, $args); } }