]> git.mxchange.org Git - core.git/blobdiff - framework/main/classes/class_BaseFrameworkSystem.php
Continued:
[core.git] / framework / main / classes / class_BaseFrameworkSystem.php
index 26d9392017b758c9ffcc571f3830204a3a5db6a5..822debf99fbfd5ac4c7fbca6c0eff4c311a3d695 100644 (file)
@@ -4,40 +4,29 @@ namespace Org\Mxchange\CoreFramework\Object;
 
 // Import framework stuff
 use Org\Mxchange\CoreFramework\Bootstrap\FrameworkBootstrap;
-use Org\Mxchange\CoreFramework\Criteria\Criteria;
-use Org\Mxchange\CoreFramework\Criteria\Local\LocalSearchCriteria;
-use Org\Mxchange\CoreFramework\Criteria\Local\LocalUpdateCriteria;
-use Org\Mxchange\CoreFramework\Crypto\Cryptable;
-use Org\Mxchange\CoreFramework\Database\Frontend\DatabaseWrapper;
 use Org\Mxchange\CoreFramework\EntryPoint\ApplicationEntryPoint;
-use Org\Mxchange\CoreFramework\Factory\Database\Wrapper\DatabaseWrapperFactory;
-use Org\Mxchange\CoreFramework\Factory\ObjectFactory;
+use Org\Mxchange\CoreFramework\Factory\Object\ObjectFactory;
+use Org\Mxchange\CoreFramework\Filesystem\FileIoException;
 use Org\Mxchange\CoreFramework\Filesystem\PathWriteProtectedException;
 use Org\Mxchange\CoreFramework\Generic\FrameworkInterface;
 use Org\Mxchange\CoreFramework\Generic\NullPointerException;
 use Org\Mxchange\CoreFramework\Generic\UnsupportedOperationException;
-use Org\Mxchange\CoreFramework\Handler\Handleable;
-use Org\Mxchange\CoreFramework\Helper\Helper;
+use Org\Mxchange\CoreFramework\Helper\Application\ApplicationHelper;
 use Org\Mxchange\CoreFramework\Loader\ClassLoader;
-use Org\Mxchange\CoreFramework\Localization\ManageableLanguage;
 use Org\Mxchange\CoreFramework\Manager\ManageableApplication;
 use Org\Mxchange\CoreFramework\Middleware\Debug\DebugMiddleware;
 use Org\Mxchange\CoreFramework\Registry\GenericRegistry;
 use Org\Mxchange\CoreFramework\Result\Database\CachedDatabaseResult;
-use Org\Mxchange\CoreFramework\Result\Search\SearchableResult;
 use Org\Mxchange\CoreFramework\State\Stateable;
-use Org\Mxchange\CoreFramework\Stream\Input\InputStream;
 use Org\Mxchange\CoreFramework\Stream\Output\OutputStreamer;
-use Org\Mxchange\CoreFramework\Stream\Output\OutputStream;
-use Org\Mxchange\CoreFramework\User\ManageableAccount;
-use Org\Mxchange\CoreFramework\Utils\String\StringUtils;
+use Org\Mxchange\CoreFramework\Utils\Strings\StringUtils;
 
 // Import SPL stuff
-use \stdClass;
+use \BadMethodCallException;
 use \InvalidArgumentException;
-use \Iterator;
 use \ReflectionClass;
 use \SplFileInfo;
+use \stdClass;
 
 /**
  * The simulator system class is the super class of all other classes. This
@@ -45,7 +34,7 @@ use \SplFileInfo;
  *
  * @author             Roland Haeder <webmaster@shipsimu.org>
  * @version            0.0.0
- * @copyright  Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2020 Core Developer Team
+ * @copyright  Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2022 Core Developer Team
  * @license            GNU GPL 3.0 or any newer version
  * @link               http://www.shipsimu.org
  *
@@ -64,80 +53,24 @@ use \SplFileInfo;
  */
 abstract class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
        /**
-        * Length of output from hash()
+        * Self-referencing instance
         */
-       private static $hashLength = NULL;
+       private static $selfInstance = NULL;
 
        /**
-        * Self-referencing instance
+        * Stub methods
         */
-       private static $instance = NULL;
+       private static $stubMethods = [
+               'partialStub' => true,
+               '__call' => true,
+               '__callStatic' => true,
+       ];
 
        /**
         * The real class name
         */
        private $realClass = __CLASS__;
 
-       /**
-        * Search criteria instance
-        */
-       private $searchInstance = NULL;
-
-       /**
-        * Update criteria instance
-        */
-       private $updateInstance = NULL;
-
-       /**
-        * Database result instance
-        */
-       private $resultInstance = NULL;
-
-       /**
-        * Instance for user class
-        */
-       private $userInstance = NULL;
-
-       /**
-        * Instance of a crypto helper
-        */
-       private $cryptoInstance = NULL;
-
-       /**
-        * Instance of an Iterator class
-        */
-       private $iteratorInstance = NULL;
-
-       /**
-        * A helper instance for the form
-        */
-       private $helperInstance = NULL;
-
-       /**
-        * An instance of a InputStream class
-        */
-       private $inputStreamInstance = NULL;
-
-       /**
-        * An instance of a OutputStream class
-        */
-       private $outputStreamInstance = NULL;
-
-       /**
-        * Handler instance
-        */
-       private $handlerInstance = NULL;
-
-       /**
-        * An instance of a database wrapper class
-        */
-       private $wrapperInstance = NULL;
-
-       /**
-        * State instance
-        */
-       private $stateInstance = NULL;
-
        /**
         * Call-back instance
         */
@@ -146,7 +79,7 @@ abstract class BaseFrameworkSystem extends stdClass implements FrameworkInterfac
        /**
         * Generic array
         */
-       private $genericArray = array();
+       private $genericArray = [];
 
        /***********************
         * Exception codes.... *
@@ -236,7 +169,7 @@ abstract class BaseFrameworkSystem extends stdClass implements FrameworkInterfac
                if (self::$startupTime == 0) {
                        // Then set it
                        self::$startupTime = microtime(true);
-               } // END - if
+               }
        }
 
        /**
@@ -245,9 +178,6 @@ abstract class BaseFrameworkSystem extends stdClass implements FrameworkInterfac
         * @return      void
         */
        public function __destruct () {
-               // Flush any updated entries to the database
-               $this->flushPendingUpdates();
-
                // Is this object already destroyed?
                if ($this->__toString() != 'DestructedObject') {
                        // Destroy all informations about this class but keep some text about it alive
@@ -271,15 +201,15 @@ abstract class BaseFrameworkSystem extends stdClass implements FrameworkInterfac
         * @args        $args                   Arguments passed to the method
         * @return      void
         */
-       public final function __call ($methodName, $args) {
+       public final function __call (string $methodName, array $args = NULL) {
                // Set self-instance
-               self::$instance = $this;
+               self::$selfInstance = $this;
 
                // Call static method
                self::__callStatic($methodName, $args);
 
                // Clear self-instance
-               self::$instance = NULL;
+               self::$selfInstance = NULL;
        }
 
        /**
@@ -288,23 +218,21 @@ abstract class BaseFrameworkSystem extends stdClass implements FrameworkInterfac
         * @param       $methodName             Name of the missing method
         * @param       $args                   Arguments passed to the method
         * @return      void
-        * @throws      InvalidArgumentException If self::$instance is not a framework's own object
+        * @throws      InvalidArgumentException If self::$selfInstance is not a framework's own object
         */
-       public static final function __callStatic ($methodName, $args) {
-               // Trace message
-               //* PRINT-DEBUG: */ printf('[%s:%d]: methodName=%s,args[]=%s - CALLED!' . PHP_EOL, __METHOD__, __LINE__, $methodName, gettype($args));
-
+       public static final function __callStatic (string $methodName, array $args = NULL) {
                // Init argument string and class name
+               //* PRINT-DEBUG: */ printf('[%s:%d]: methodName=%s,args[]=%s - CALLED!' . PHP_EOL, __METHOD__, __LINE__, $methodName, gettype($args));
                $argsString = '';
                $className = 'unknown';
 
                // Is self-instance set?
-               if (self::$instance instanceof FrameworkInterface) {
+               if (self::$selfInstance instanceof FrameworkInterface) {
                        // Framework's own instance
-                       $className = self::$instance->__toString();
-               } elseif (!is_null(self::$instance)) {
+                       $className = self::$selfInstance->__toString();
+               } elseif (!is_null(self::$selfInstance)) {
                        // Invalid argument!
-                       throw new InvalidArgumentException(sprintf('self::instance[%s] is not expected.', gettype(self::$instance)), self::EXCEPTION_SELF_INSTANCE);
+                       throw new InvalidArgumentException(sprintf('self::instance[%s] is not expected.', gettype(self::$selfInstance)), self::EXCEPTION_SELF_INSTANCE);
                }
 
                // Is it NULL, empty or an array?
@@ -348,19 +276,16 @@ abstract class BaseFrameworkSystem extends stdClass implements FrameworkInterfac
 
                                // Comma for next one
                                $argsString .= ', ';
-                       } // END - foreach
+                       }
 
                        // Last comma found?
                        if (substr($argsString, -2, 1) == ',') {
                                // Remove last comma
                                $argsString = substr($argsString, 0, -2);
-                       } // END - if
+                       }
 
                        // Close braces
                        $argsString .= ')';
-               } else {
-                       // Invalid arguments!
-                       $argsString = sprintf('!INVALID:%s!', gettype($args));
                }
 
                // Output stub message
@@ -391,7 +316,7 @@ abstract class BaseFrameworkSystem extends stdClass implements FrameworkInterfac
         * @param       $value  Value to store
         * @return      void
         */
-       public final function __set ($name, $value) {
+       public final function __set (string $name, $value) {
                $this->debugBackTrace(sprintf('Tried to set a missing field. name=%s, value[%s]=%s',
                        $name,
                        gettype($value),
@@ -405,7 +330,7 @@ abstract class BaseFrameworkSystem extends stdClass implements FrameworkInterfac
         * @param       $name   Name of the field/attribute
         * @return      void
         */
-       public final function __get ($name) {
+       public final function __get (string $name) {
                $this->debugBackTrace(sprintf('Tried to get a missing field. name=%s',
                        $name
                ));
@@ -417,7 +342,7 @@ abstract class BaseFrameworkSystem extends stdClass implements FrameworkInterfac
         * @param       $name   Name of the field/attribute
         * @return      void
         */
-       public final function __unset ($name) {
+       public final function __unset (string $name) {
                $this->debugBackTrace(sprintf('Tried to unset a missing field. name=%s',
                        $name
                ));
@@ -430,7 +355,7 @@ abstract class BaseFrameworkSystem extends stdClass implements FrameworkInterfac
         * @throws      UnsupportedOperationException   Objects of this framework cannot be serialized
         */
        public final function __sleep () {
-               throw new UnsupportedOperationException(array($this, __FUNCTION__), self::EXCEPTION_UNSPPORTED_OPERATION);
+               throw new UnsupportedOperationException([$this, __FUNCTION__], self::EXCEPTION_UNSPPORTED_OPERATION);
        }
 
        /**
@@ -440,7 +365,7 @@ abstract class BaseFrameworkSystem extends stdClass implements FrameworkInterfac
         * @throws      UnsupportedOperationException   Objects of this framework cannot be serialized
         */
        public final function __wakeup () {
-               throw new UnsupportedOperationException(array($this, __FUNCTION__), self::EXCEPTION_UNSPPORTED_OPERATION);
+               throw new UnsupportedOperationException([$this, __FUNCTION__], self::EXCEPTION_UNSPPORTED_OPERATION);
        }
 
        /**
@@ -450,7 +375,7 @@ abstract class BaseFrameworkSystem extends stdClass implements FrameworkInterfac
         * @throws      UnsupportedOperationException   Objects of this framework cannot be serialized
         */
        public final function __invoke () {
-               throw new UnsupportedOperationException(array($this, __FUNCTION__), self::EXCEPTION_UNSPPORTED_OPERATION);
+               throw new UnsupportedOperationException([$this, __FUNCTION__], self::EXCEPTION_UNSPPORTED_OPERATION);
        }
 
        /**
@@ -459,67 +384,9 @@ abstract class BaseFrameworkSystem extends stdClass implements FrameworkInterfac
         * @param       $realClass      Class name (string)
         * @return      void
         */
-       public final function setRealClass ($realClass) {
+       public final function setRealClass (string $realClass) {
                // Set real class
-               $this->realClass = (string) $realClass;
-       }
-
-       /**
-        * Setter for database result instance
-        *
-        * @param       $resultInstance         An instance of a database result class
-        * @return      void
-        * @todo        SearchableResult and UpdateableResult shall have a super interface to use here
-        */
-       protected final function setResultInstance (SearchableResult $resultInstance) {
-               $this->resultInstance =  $resultInstance;
-       }
-
-       /**
-        * Getter for database result instance
-        *
-        * @return      $resultInstance         An instance of a database result class
-        */
-       public final function getResultInstance () {
-               return $this->resultInstance;
-       }
-
-       /**
-        * Setter for search instance
-        *
-        * @param       $searchInstance         Searchable criteria instance
-        * @return      void
-        */
-       public final function setSearchInstance (LocalSearchCriteria $searchInstance) {
-               $this->searchInstance = $searchInstance;
-       }
-
-       /**
-        * Getter for search instance
-        *
-        * @return      $searchInstance         Searchable criteria instance
-        */
-       public final function getSearchInstance () {
-               return $this->searchInstance;
-       }
-
-       /**
-        * Setter for update instance
-        *
-        * @param       $updateInstance         An instance of a LocalUpdateCriteria clase
-        * @return      void
-        */
-       public final function setUpdateInstance (LocalUpdateCriteria $updateInstance) {
-               $this->updateInstance = $updateInstance;
-       }
-
-       /**
-        * Getter for update instance
-        *
-        * @return      $updateInstance         Updateable criteria instance
-        */
-       public final function getUpdateInstance () {
-               return $this->updateInstance;
+               $this->realClass = $realClass;
        }
 
        /**
@@ -538,11 +405,7 @@ abstract class BaseFrameworkSystem extends stdClass implements FrameworkInterfac
         * @return      $debugInstance  Instance to class DebugConsoleOutput or DebugWebOutput
         */
        public final function getDebugInstance () {
-               // Get debug instance
-               $debugInstance = GenericRegistry::getRegistry()->getInstance('debug');
-
-               // Return it
-               return $debugInstance;
+               return GenericRegistry::getRegistry()->getInstance('debug');
        }
 
        /**
@@ -561,200 +424,7 @@ abstract class BaseFrameworkSystem extends stdClass implements FrameworkInterfac
         * @return      $webOutputInstance - Instance to class WebOutput
         */
        public final function getWebOutputInstance () {
-               $webOutputInstance = GenericRegistry::getRegistry()->getInstance('web_output');
-               return $webOutputInstance;
-       }
-
-       /**
-        * Private getter for language instance
-        *
-        * @return      $langInstance   An instance to the language sub-system
-        */
-       protected final function getLanguageInstance () {
-               $langInstance = GenericRegistry::getRegistry()->getInstance('language');
-               return $langInstance;
-       }
-
-       /**
-        * Setter for language instance
-        *
-        * @param       $langInstance   An instance to the language sub-system
-        * @return      void
-        * @see         LanguageSystem
-        */
-       public final function setLanguageInstance (ManageableLanguage $langInstance) {
-               GenericRegistry::getRegistry()->addInstance('language', $langInstance);
-       }
-
-       /**
-        * Protected setter for user instance
-        *
-        * @param       $userInstance   An instance of a user class
-        * @return      void
-        */
-       protected final function setUserInstance (ManageableAccount $userInstance) {
-               $this->userInstance = $userInstance;
-       }
-
-       /**
-        * Getter for user instance
-        *
-        * @return      $userInstance   An instance of a user class
-        */
-       public final function getUserInstance () {
-               return $this->userInstance;
-       }
-
-       /**
-        * Setter for Cryptable instance
-        *
-        * @param       $cryptoInstance An instance of a Cryptable class
-        * @return      void
-        */
-       protected final function setCryptoInstance (Cryptable $cryptoInstance) {
-               $this->cryptoInstance = $cryptoInstance;
-       }
-
-       /**
-        * Getter for Cryptable instance
-        *
-        * @return      $cryptoInstance An instance of a Cryptable class
-        */
-       public final function getCryptoInstance () {
-               return $this->cryptoInstance;
-       }
-
-       /**
-        * Setter for DatabaseWrapper instance
-        *
-        * @param       $wrapperInstance        An instance of an DatabaseWrapper
-        * @return      void
-        */
-       public final function setWrapperInstance (DatabaseWrapper $wrapperInstance) {
-               $this->wrapperInstance = $wrapperInstance;
-       }
-
-       /**
-        * Getter for DatabaseWrapper instance
-        *
-        * @return      $wrapperInstance        An instance of an DatabaseWrapper
-        */
-       public final function getWrapperInstance () {
-               return $this->wrapperInstance;
-       }
-
-       /**
-        * Setter for helper instance
-        *
-        * @param       $helperInstance         An instance of a helper class
-        * @return      void
-        */
-       protected final function setHelperInstance (Helper $helperInstance) {
-               $this->helperInstance = $helperInstance;
-       }
-
-       /**
-        * Getter for helper instance
-        *
-        * @return      $helperInstance         An instance of a helper class
-        */
-       public final function getHelperInstance () {
-               return $this->helperInstance;
-       }
-
-       /**
-        * Getter for a InputStream instance
-        *
-        * @param       $inputStreamInstance    The InputStream instance
-        */
-       protected final function getInputStreamInstance () {
-               return $this->inputStreamInstance;
-       }
-
-       /**
-        * Setter for a InputStream instance
-        *
-        * @param       $inputStreamInstance    The InputStream instance
-        * @return      void
-        */
-       protected final function setInputStreamInstance (InputStream $inputStreamInstance) {
-               $this->inputStreamInstance = $inputStreamInstance;
-       }
-
-       /**
-        * Getter for a OutputStream instance
-        *
-        * @param       $outputStreamInstance   The OutputStream instance
-        */
-       protected final function getOutputStreamInstance () {
-               return $this->outputStreamInstance;
-       }
-
-       /**
-        * Setter for a OutputStream instance
-        *
-        * @param       $outputStreamInstance   The OutputStream instance
-        * @return      void
-        */
-       protected final function setOutputStreamInstance (OutputStream $outputStreamInstance) {
-               $this->outputStreamInstance = $outputStreamInstance;
-       }
-
-       /**
-        * Setter for handler instance
-        *
-        * @param       $handlerInstance        An instance of a Handleable class
-        * @return      void
-        */
-       protected final function setHandlerInstance (Handleable $handlerInstance) {
-               $this->handlerInstance = $handlerInstance;
-       }
-
-       /**
-        * Getter for handler instance
-        *
-        * @return      $handlerInstance        A Handleable instance
-        */
-       protected final function getHandlerInstance () {
-               return $this->handlerInstance;
-       }
-
-       /**
-        * Setter for Iterator instance
-        *
-        * @param       $iteratorInstance       An instance of an Iterator
-        * @return      void
-        */
-       protected final function setIteratorInstance (Iterator $iteratorInstance) {
-               $this->iteratorInstance = $iteratorInstance;
-       }
-
-       /**
-        * Getter for Iterator instance
-        *
-        * @return      $iteratorInstance       An instance of an Iterator
-        */
-       public final function getIteratorInstance () {
-               return $this->iteratorInstance;
-       }
-
-       /**
-        * Setter for state instance
-        *
-        * @param       $stateInstance  A Stateable instance
-        * @return      void
-        */
-       public final function setStateInstance (Stateable $stateInstance) {
-               $this->stateInstance = $stateInstance;
-       }
-
-       /**
-        * Getter for state instance
-        *
-        * @return      $stateInstance  A Stateable instance
-        */
-       public final function getStateInstance () {
-               return $this->stateInstance;
+               return GenericRegistry::getRegistry()->getInstance('web_output');
        }
 
        /**
@@ -812,11 +482,11 @@ abstract class BaseFrameworkSystem extends stdClass implements FrameworkInterfac
         * @param       $str    A string (maybe) without trailing slash
         * @return      $str    A string with an auto-appended trailing slash
         */
-       public final function addMissingTrailingSlash ($str) {
+       public final function addMissingTrailingSlash (string $str) {
                // Is there a trailing slash?
                if (substr($str, -1, 1) != '/') {
                        $str .= '/';
-               } // END - if
+               }
 
                // Return string with trailing slash
                return $str;
@@ -828,7 +498,7 @@ abstract class BaseFrameworkSystem extends stdClass implements FrameworkInterfac
         * @param       $message        Optional message to show in debug output
         * @return      void
         */
-       public final function debugInstance ($message = '') {
+       public final function debugInstance (string $message = '') {
                // Restore the error handler to avoid trouble with missing array elements or undeclared variables
                restore_error_handler();
 
@@ -841,7 +511,7 @@ abstract class BaseFrameworkSystem extends stdClass implements FrameworkInterfac
                        $content = sprintf('<div class="debug_message">
        Message: %s
 </div>' . PHP_EOL, $message);
-               } // END - if
+               }
 
                // Generate the output
                $content .= sprintf('<pre>%s</pre>',
@@ -869,32 +539,13 @@ Loaded includes:
                ));
        }
 
-       /**
-        * Replaces control characters with printable output
-        *
-        * @param       $str    String with control characters
-        * @return      $str    Replaced string
-        */
-       protected function replaceControlCharacters ($str) {
-               // Replace them
-               $str = str_replace(
-                       chr(13), '[r]', str_replace(
-                       chr(10), '[n]', str_replace(
-                       chr(9) , '[t]',
-                       $str
-               )));
-
-               // Return it
-               return $str;
-       }
-
        /**
         * Output a partial stub message for the caller method
         *
         * @param       $message        An optional message to display
         * @return      void
         */
-       protected function partialStub ($message = '') {
+       protected function partialStub (string $message = '') {
                // Init variable
                $stubMessage = 'Partial stub!';
 
@@ -902,7 +553,7 @@ Loaded includes:
                if (!empty($message)) {
                        // Then add it as well
                        $stubMessage .= ' Message: ' . $message;
-               } // END - if
+               }
 
                // Debug instance is there?
                if (!is_null($this->getDebugInstance())) {
@@ -922,12 +573,12 @@ Loaded includes:
         * @param       $doExit         Whether exit the program (true is default)
         * @return      void
         */
-       public function debugBackTrace ($message = '', $doExit = true) {
+       public function debugBackTrace (string $message = '', bool $doExit = true) {
                // Sorry, there is no other way getting this nice backtrace
                if (!empty($message)) {
                        // Output message
                        printf('Message: %s<br />' . PHP_EOL, $message);
-               } // END - if
+               }
 
                print('<pre>');
                debug_print_backtrace();
@@ -936,7 +587,7 @@ Loaded includes:
                // Exit program?
                if ($doExit === true) {
                        exit();
-               } // END - if
+               }
        }
 
        /**
@@ -947,9 +598,12 @@ Loaded includes:
         * @return      $debugInstance  An instance of a debugger class
         * @deprecated  Not fully, as the new Logger facilities are not finished yet.
         */
-       public final static function createDebugInstance ($className, $lineNumber = NULL) {
-               // Is the instance set?
-               if (!GenericRegistry::getRegistry()->instanceExists('debug')) {
+       public final static function createDebugInstance (string $className, int $lineNumber = NULL) {
+               // Validate parameter
+               if (empty($className)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "className" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (!GenericRegistry::getRegistry()->instanceExists('debug')) {
                        // Init debug instance
                        $debugInstance = NULL;
 
@@ -959,7 +613,7 @@ Loaded includes:
                                $debugInstance = DebugMiddleware::createDebugMiddleware(FrameworkBootstrap::getConfigurationInstance()->getConfigEntry('debug_' . FrameworkBootstrap::getRequestTypeFromSystem() . '_class'), $className);
                        } catch (NullPointerException $e) {
                                // Didn't work, no instance there
-                               exit(sprintf('Cannot create debugInstance! Exception=%s,message=%s,className=%s,lineNumber=%d' . PHP_EOL, $e->__toString(), $e->getMessage(), $className, $lineNumber));
+                               exit(sprintf('[%s:%d]: Cannot create debugInstance! Exception=%s,message=%s,className=%s,lineNumber=%d' . PHP_EOL, __METHOD__, __LINE__, $e->__toString(), $e->getMessage(), $className, $lineNumber));
                        }
 
                        // Empty string should be ignored and used for testing the middleware
@@ -982,7 +636,7 @@ Loaded includes:
         * @param       $message        Message to output
         * @return      void
         */
-       public function outputLine ($message) {
+       public function outputLine (string $message) {
                // Simply output it
                print($message . PHP_EOL);
        }
@@ -997,7 +651,7 @@ Loaded includes:
         * @paran       $stripTags      Whether to strip tags (default: false)
         * @return      void
         */
-       public function debugOutput ($message, $doPrint = true, $stripTags = false) {
+       public function debugOutput (string $message, bool $doPrint = true, bool $stripTags = false) {
                // Set debug instance to NULL
                $debugInstance = NULL;
 
@@ -1005,7 +659,7 @@ Loaded includes:
                $backtrace = debug_backtrace(!DEBUG_BACKTRACE_PROVIDE_OBJECT);
 
                // Is function partialStub/__callStatic ?
-               if (in_array($backtrace[1]['function'], array('partialStub', '__call', '__callStatic'))) {
+               if (isset(self::$stubMethods[$backtrace[1]['function']])) {
                        // Prepend class::function:line from 3rd element
                        $message = sprintf('[%s::%s:%d]: %s',
                                $backtrace[2]['class'],
@@ -1039,13 +693,13 @@ Loaded includes:
                        if ($doPrint === false) {
                                // Die here if not printed
                                exit();
-                       } // END - if
+                       }
                } else {
                        // Are debug times enabled?
-                       if (FrameworkBootstrap::getConfigurationInstance()->getConfigEntry('debug_' . FrameworkBootstrap::getRequestTypeFromSystem() . '_output_timings') == 'Y') {
+                       if (FrameworkBootstrap::getConfigurationInstance()->isEnabled('debug_' . FrameworkBootstrap::getRequestTypeFromSystem() . '_output_timings')) {
                                // Prepent it
                                $message = $this->getPrintableExecutionTime() . $message;
-                       } // END - if
+                       }
 
                        // Put directly out
                        if ($doPrint === true) {
@@ -1064,7 +718,7 @@ Loaded includes:
         * @param       $phpCode                Unmarked PHP code
         * @return      $markedCode             Marked PHP code
         */
-       public function markupCode ($phpCode) {
+       public function markupCode (string $phpCode) {
                // Init marked code
                $markedCode = '';
 
@@ -1080,7 +734,7 @@ Loaded includes:
                                $errorArray['message'],
                                $errorArray['type']
                        );
-               } // END - if
+               }
 
                // Add line number to the code
                foreach (explode(chr(10), $phpCode) as $lineNo => $code) {
@@ -1089,92 +743,29 @@ Loaded includes:
                                ($lineNo + 1),
                                htmlentities($code, ENT_QUOTES)
                        );
-               } // END - foreach
+               }
 
                // Return the code
                return $markedCode;
        }
 
-       /**
-        * Filter a given GMT timestamp (non Uni* stamp!) to make it look more
-        * beatiful for web-based front-ends. If null is given a message id
-        * null_timestamp will be resolved and returned.
-        *
-        * @param       $timestamp      Timestamp to prepare (filter) for display
-        * @return      $readable       A readable timestamp
-        */
-       public function doFilterFormatTimestamp ($timestamp) {
-               // Default value to return
-               $readable = '???';
-
-               // Is the timestamp null?
-               if (is_null($timestamp)) {
-                       // Get a message string
-                       $readable = $this->getLanguageInstance()->getMessage('null_timestamp');
-               } else {
-                       switch ($this->getLanguageInstance()->getLanguageCode()) {
-                               case 'de': // German format is a bit different to default
-                                       // Split the GMT stamp up
-                                       $dateTime  = explode(' ', $timestamp  );
-                                       $dateArray = explode('-', $dateTime[0]);
-                                       $timeArray = explode(':', $dateTime[1]);
-
-                                       // Construct the timestamp
-                                       $readable = sprintf(FrameworkBootstrap::getConfigurationInstance()->getConfigEntry('german_date_time'),
-                                               $dateArray[0],
-                                               $dateArray[1],
-                                               $dateArray[2],
-                                               $timeArray[0],
-                                               $timeArray[1],
-                                               $timeArray[2]
-                                       );
-                                       break;
-
-                               default: // Default is pass-through
-                                       $readable = $timestamp;
-                                       break;
-                       } // END - switch
-               }
-
-               // Return the stamp
-               return $readable;
-       }
-
-       /**
-        * Filter a given number into a localized number
-        *
-        * @param       $value          The raw value from e.g. database
-        * @return      $localized      Localized value
-        */
-       public function doFilterFormatNumber ($value) {
-               // Generate it from config and localize dependencies
-               switch ($this->getLanguageInstance()->getLanguageCode()) {
-                       case 'de': // German format is a bit different to default
-                               $localized = number_format($value, FrameworkBootstrap::getConfigurationInstance()->getConfigEntry('decimals'), ',', '.');
-                               break;
-
-                       default: // US, etc.
-                               $localized = number_format($value, FrameworkBootstrap::getConfigurationInstance()->getConfigEntry('decimals'), '.', ',');
-                               break;
-               } // END - switch
-
-               // Return it
-               return $localized;
-       }
-
        /**
         * "Getter" for databse entry
         *
         * @return      $entry  An array with database entries
         * @throws      NullPointerException    If the database result is not found
         * @throws      InvalidDatabaseResultException  If the database result is invalid
+        * @deprecated  Monolithic method, should be moved to proper classes
         */
        protected final function getDatabaseEntry () {
+               // This method is deprecated
+               $this->deprecationWarning('Monolithic method, should be moved to proper classes');
+
                // Is there an instance?
                if (!$this->getResultInstance() instanceof SearchableResult) {
                        // Throw an exception here
                        throw new NullPointerException($this, self::EXCEPTION_IS_NULL_POINTER);
-               } // END - if
+               }
 
                // Rewind it
                $this->getResultInstance()->rewind();
@@ -1183,7 +774,7 @@ Loaded includes:
                if ($this->getResultInstance()->valid() === false) {
                        // @TODO Move the constant to e.g. BaseDatabaseResult when there is a non-cached database result available
                        throw new InvalidDatabaseResultException(array($this, $this->getResultInstance()), CachedDatabaseResult::EXCEPTION_INVALID_DATABASE_RESULT);
-               } // END - if
+               }
 
                // Get next entry
                $this->getResultInstance()->next();
@@ -1201,8 +792,19 @@ Loaded includes:
         * @param       $fieldName              Field name which we shall get
         * @return      $fieldValue             Field value from the user
         * @throws      NullPointerException    If the result instance is null
+        * @throws      InvalidArgumentException        If a parameter is not valid
+        * @deprecated  Monolithic method, should be moved to proper classes
         */
        public final function getField (string $fieldName) {
+               // Check parameter
+               if (empty($fieldName)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "fieldName" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               }
+
+               // This method is deprecated
+               $this->deprecationWarning('Monolithic method, should be moved to proper classes');
+
                // Default field value
                $fieldValue = NULL;
 
@@ -1213,7 +815,7 @@ Loaded includes:
                if (is_null($resultInstance)) {
                        // Then the user instance is no longer valid (expired cookies?)
                        throw new NullPointerException($this, self::EXCEPTION_IS_NULL_POINTER);
-               } // END - if
+               }
 
                // Get current array
                $fieldArray = $resultInstance->current();
@@ -1226,12 +828,12 @@ Loaded includes:
                if ($this->isFieldSet($fieldName)) {
                        // Get it
                        $fieldValue = $fieldArray[$fieldName2];
-               } elseif (defined('DEVELOPER')) {
+               } elseif (FrameworkBootstrap::getConfigurationInstance()->getConfigEntry('developer_mode_enabled')) {
                        // Missing field entry, may require debugging
-                       self::createDebugInstance(__CLASS__, __LINE__)->debugOutput('[' . __METHOD__ . ':' . __LINE__ . ']:fieldArray<pre>=' . print_r($fieldArray, true) . '</pre>,fieldName=' . $fieldName . ' not found!');
+                       self::createDebugInstance(__CLASS__, __LINE__)->debugOutput('BASE-FRAMEWORK-SYSTEM: fieldArray<pre>=' . print_r($fieldArray, true) . '</pre>,fieldName=' . $fieldName . ' not found!');
                } else {
                        // Missing field entry, may require debugging
-                       self::createDebugInstance(__CLASS__, __LINE__)->debugOutput('[' . __METHOD__ . ':' . __LINE__ . ']:fieldName=' . $fieldName . ' not found!');
+                       self::createDebugInstance(__CLASS__, __LINE__)->debugOutput('BASE-FRAMEWORK-SYSTEM: fieldName=' . $fieldName . ' not found!');
                }
 
                // Return it
@@ -1244,8 +846,15 @@ Loaded includes:
         * @param       $fieldName      Field name to check
         * @return      $isSet          Whether the given field name is set
         * @throws      NullPointerException    If the result instance is null
+        * @throws      InvalidArgumentException        If a parameter is not valid
         */
        public function isFieldSet (string $fieldName) {
+               // Check parameter
+               if (empty($fieldName)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "fieldName" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               }
+
                // Get result instance
                $resultInstance = $this->getResultInstance();
 
@@ -1253,7 +862,7 @@ Loaded includes:
                if (is_null($resultInstance)) {
                        // Then the user instance is no longer valid (expired cookies?)
                        throw new NullPointerException($this, self::EXCEPTION_IS_NULL_POINTER);
-               } // END - if
+               }
 
                // Get current array
                $fieldArray = $resultInstance->current();
@@ -1269,28 +878,6 @@ Loaded includes:
                return $isSet;
        }
 
-       /**
-        * Flushs all pending updates to the database layer
-        *
-        * @return      void
-        */
-       public function flushPendingUpdates () {
-               // Get result instance
-               $resultInstance = $this->getResultInstance();
-
-               // Do we have data to update?
-               if ((is_object($resultInstance)) && ($resultInstance->ifDataNeedsFlush())) {
-                       // Get wrapper class name config entry
-                       $configEntry = $resultInstance->getUpdateInstance()->getWrapperConfigEntry();
-
-                       // Create object instance
-                       $wrapperInstance = DatabaseWrapperFactory::createWrapperByConfiguredName($configEntry);
-
-                       // Yes, then send the whole result to the database layer
-                       $wrapperInstance->doUpdateByResult($this->getResultInstance());
-               } // END - if
-       }
-
        /**
         * Outputs a deprecation warning to the developer.
         *
@@ -1298,9 +885,9 @@ Loaded includes:
         * @return      void
         * @todo        Write a logging mechanism for productive mode
         */
-       public function deprecationWarning ($message) {
+       public function deprecationWarning (string $message) {
                // Is developer mode active?
-               if (defined('DEVELOPER')) {
+               if (FrameworkBootstrap::getConfigurationInstance()->getConfigEntry('developer_mode_enabled')) {
                        // Debug instance is there?
                        if (!is_null($this->getDebugInstance())) {
                                // Output stub message
@@ -1321,8 +908,15 @@ Loaded includes:
         *
         * @param       $phpExtension   The PHP extension we shall check
         * @return      $isLoaded       Whether the PHP extension is loaded
+        * @throws      InvalidArgumentException        If a parameter is not valid
         */
-       public final function isPhpExtensionLoaded ($phpExtension) {
+       public final function isPhpExtensionLoaded (string $phpExtension) {
+               // Check parameter
+               if (empty($phpExtension)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "phpExtension" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               }
+
                // Is it loaded?
                $isLoaded = in_array($phpExtension, get_loaded_extensions());
 
@@ -1348,8 +942,15 @@ Loaded includes:
         * Idles (sleeps) for given milliseconds
         *
         * @return      $hasSlept       Whether it goes fine
+        * @throws      InvalidArgumentException        If a parameter is not valid
         */
-       public function idle ($milliSeconds) {
+       public function idle (int $milliSeconds) {
+               // Check parameter
+               if ($milliSeconds < 1) {
+                       // Throw IAE
+                       throw new InvalidArgumentException(sprintf('milliSeconds=%d are not a reasonable value to idle', $milliSeconds));
+               }
+
                // Sleep is fine by default
                $hasSlept = true;
 
@@ -1377,8 +978,15 @@ Loaded includes:
         *
         * @param       $encodedData    Encoded data we shall check
         * @return      $isBase64               Whether the encoded data is Base64
+        * @throws      InvalidArgumentException        If a parameter is not valid
         */
-       protected function isBase64Encoded ($encodedData) {
+       protected function isBase64Encoded (string $encodedData) {
+               // Check parameter
+               if (empty($encodedData)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "encodedData" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               }
+
                // Determine it
                $isBase64 = (@base64_decode($encodedData, true) !== false);
 
@@ -1386,26 +994,6 @@ Loaded includes:
                return $isBase64;
        }
 
-       /**
-        * Gets a cache key from Criteria instance
-        *
-        * @param       $criteriaInstance       An instance of a Criteria class
-        * @param       $onlyKeys                       Only use these keys for a cache key
-        * @return      $cacheKey                       A cache key suitable for lookup/storage purposes
-        */
-       protected function getCacheKeyByCriteria (Criteria $criteriaInstance, array $onlyKeys = array()) {
-               // Generate it
-               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput('BASE-FRAMEWORK-SYSTEM: criteriaInstance=' . $criteriaInstance->__toString() . ',onlyKeys()=' . count($onlyKeys) . ' - CALLED!');
-               $cacheKey = sprintf('%s@%s',
-                       $this->__toString(),
-                       $criteriaInstance->getCacheKey($onlyKeys)
-               );
-
-               // And return it
-               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput('BASE-FRAMEWORK-SYSTEM: cacheKey=' . $cacheKey . ' - EXIT!');
-               return $cacheKey;
-       }
-
        /**
         * Getter for startup time in miliseconds
         *
@@ -1421,97 +1009,13 @@ Loaded includes:
         * @return      $executionTime  Current execution time in nice braces
         */
        protected function getPrintableExecutionTime () {
-               // Caculate the execution time
-               $executionTime = microtime(true) - $this->getStartupTime();
-
-               // Pack it in nice braces
-               $executionTime = sprintf('[ %01.5f ] ', $executionTime);
+               // Calculate execution time and pack it in nice braces
+               $executionTime = sprintf('[ %01.5f ] ', (microtime(true) - $this->getStartupTime()));
 
                // And return it
                return $executionTime;
        }
 
-       /**
-        * Hashes a given string with a simple but stronger hash function (no salt)
-        * and hex-encode it.
-        *
-        * @param       $str    The string to be hashed
-        * @return      $hash   The hash from string $str
-        */
-       public static final function hash ($str) {
-               // Hash given string with (better secure) hasher
-               $hash = bin2hex(mhash(MHASH_SHA256, $str));
-
-               // Return it
-               return $hash;
-       }
-
-       /**
-        * "Getter" for length of hash() output. This will be "cached" to speed up
-        * things.
-        *
-        * @return      $length         Length of hash() output
-        */
-       public static final function getHashLength () {
-               // Is it cashed?
-               if (is_null(self::$hashLength)) {
-                       // No, then hash a string and save its length.
-                       self::$hashLength = strlen(self::hash('abc123'));
-               } // END - if
-
-               // Return it
-               return self::$hashLength;
-       }
-
-       /**
-        * Checks whether the given number is really a number (only chars 0-9).
-        *
-        * @param       $num            A string consisting only chars between 0 and 9
-        * @param       $castValue      Whether to cast the value to double. Do only use this to secure numbers from Requestable classes.
-        * @param       $assertMismatch         Whether to assert mismatches
-        * @return      $ret            The (hopefully) secured numbered value
-        */
-       public function bigintval ($num, $castValue = true, $assertMismatch = false) {
-               // Filter all numbers out
-               $ret = preg_replace('/[^0123456789]/', '', $num);
-
-               // Shall we cast?
-               if ($castValue === true) {
-                       // Cast to biggest numeric type
-                       $ret = (double) $ret;
-               } // END - if
-
-               // Assert only if requested
-               if ($assertMismatch === true) {
-                       // Has the whole value changed?
-                       assert(('' . $ret . '' != '' . $num . '') && (!is_null($num)));
-               } // END - if
-
-               // Return result
-               return $ret;
-       }
-
-       /**
-        * Checks whether the given hexadecimal number is really a hex-number (only chars 0-9,a-f).
-        *
-        * @param       $num    A string consisting only chars between 0 and 9
-        * @param       $assertMismatch         Whether to assert mismatches
-        * @return      $ret    The (hopefully) secured hext-numbered value
-        */
-       public function hexval ($num, $assertMismatch = false) {
-               // Filter all numbers out
-               $ret = preg_replace('/[^0123456789abcdefABCDEF]/', '', $num);
-
-               // Assert only if requested
-               if ($assertMismatch === true) {
-                       // Has the whole value changed?
-                       assert(('' . $ret . '' != '' . $num . '') && (!is_null($num)));
-               } // END - if
-
-               // Return result
-               return $ret;
-       }
-
        /**
         * Determines if an element is set in the generic array
         *
@@ -1520,12 +1024,26 @@ Loaded includes:
         * @param       $key            Key to check
         * @param       $element        Element to check
         * @return      $isset          Whether the given key is set
-        */
-       protected final function isGenericArrayElementSet ($keyGroup, $subGroup, $key, $element) {
-               // Debug message
-               //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ',element=' . $element);
+        * @throws      InvalidArgumentException        If a parameter is not valid
+        */
+       protected final function isGenericArrayElementSet (string $keyGroup, string $subGroup, string $key, string $element) {
+               // Check parameter
+               if (empty($keyGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "keyGroup" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (empty($subGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "subGroup" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (empty($key)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "key" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif ($element === '') {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "element" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               }
 
                // Is it there?
+               //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ',element=' . $element);
                $isset = isset($this->genericArray[$keyGroup][$subGroup][$key][$element]);
 
                // Return it
@@ -1538,29 +1056,47 @@ Loaded includes:
         * @param       $subGroup       Sub group for the key
         * @param       $key            Key to check
         * @return      $isset          Whether the given key is set
-        */
-       protected final function isGenericArrayKeySet ($keyGroup, $subGroup, $key) {
-               // Debug message
-               //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key);
+        * @throws      InvalidArgumentException        If a parameter is not valid
+        */
+       protected final function isGenericArrayKeySet (string $keyGroup, string $subGroup, string $key) {
+               // Check parameter
+               if (empty($keyGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "keyGroup" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (empty($subGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "subGroup" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (empty($key)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "key" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               }
 
                // Is it there?
+               //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key);
                $isset = isset($this->genericArray[$keyGroup][$subGroup][$key]);
 
                // Return it
                return $isset;
        }
 
-
        /**
         * Determines if a group is set in the generic array
         *
         * @param       $keyGroup       Main group
         * @param       $subGroup       Sub group
         * @return      $isset          Whether the given group is set
+        * @throws      InvalidArgumentException        If a parameter is not valid
         */
-       protected final function isGenericArrayGroupSet ($keyGroup, $subGroup) {
-               // Debug message
+       protected final function isGenericArrayGroupSet (string $keyGroup, string $subGroup) {
+               // Check parameter
                //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup);
+               if (empty($keyGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "keyGroup" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (empty($subGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "subGroup" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               }
 
                // Is it there?
                $isset = isset($this->genericArray[$keyGroup][$subGroup]);
@@ -1575,17 +1111,22 @@ Loaded includes:
         * @param       $keyGroup       Main key group
         * @param       $subGroup       Sub key group
         * @return      $array          An array with all array elements
+        * @throws      InvalidArgumentException        If a parameter is not valid
+        * @throws      BadMethodCallException  If key/sub group isn't there but this method is invoked
         */
-       protected final function getGenericSubArray ($keyGroup, $subGroup) {
-               // Is it there?
-               if (!$this->isGenericArrayGroupSet($keyGroup, $subGroup)) {
-                       // No, then abort here
-                       trigger_error(__METHOD__ . ': keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ' not found.');
-                       exit;
-               } // END - if
-
-               // Debug message
+       protected final function getGenericSubArray (string $keyGroup, string $subGroup) {
+               // Check parameter
                //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',value=' . print_r($this->genericArray[$keyGroup][$subGroup], true));
+               if (empty($keyGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "keyGroup" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (empty($subGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "subGroup" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (!$this->isGenericArrayGroupSet($keyGroup, $subGroup)) {
+                       // No, then abort here
+                       throw new BadMethodCallException(sprintf('keyGroup=%s,subGroup=%s not found.', $keyGroup, $subGroup));
+               }
 
                // Return it
                return $this->genericArray[$keyGroup][$subGroup];
@@ -1598,10 +1139,21 @@ Loaded includes:
         * @param       $subGroup       Sub group for the key
         * @param       $key            Key to unset
         * @return      void
+        * @throws      InvalidArgumentException        If a parameter is not valid
         */
-       protected final function unsetGenericArrayKey ($keyGroup, $subGroup, $key) {
-               // Debug message
+       protected final function unsetGenericArrayKey (string $keyGroup, string $subGroup, string $key) {
+               // Check parameter
                //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key);
+               if (empty($keyGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "keyGroup" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (empty($subGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "subGroup" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (empty($key)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "key" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               }
 
                // Remove it
                unset($this->genericArray[$keyGroup][$subGroup][$key]);
@@ -1615,10 +1167,24 @@ Loaded includes:
         * @param       $key            Key to unset
         * @param       $element        Element to unset
         * @return      void
+        * @throws      InvalidArgumentException        If a parameter is not valid
         */
-       protected final function unsetGenericArrayElement ($keyGroup, $subGroup, $key, $element) {
-               // Debug message
+       protected final function unsetGenericArrayElement (string $keyGroup, string $subGroup, string $key, string $element) {
+               // Check parameter
                //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ',element=' . $element);
+               if (empty($keyGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "keyGroup" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (empty($subGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "subGroup" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (empty($key)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "key" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif ($element === '') {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "element" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               }
 
                // Remove it
                unset($this->genericArray[$keyGroup][$subGroup][$key][$element]);
@@ -1632,18 +1198,29 @@ Loaded includes:
         * @param       $key            Key to unset
         * @param       $value          Value to add/append
         * @return      void
+        * @throws      InvalidArgumentException        If a parameter is not valid
         */
-       protected final function appendStringToGenericArrayKey ($keyGroup, $subGroup, $key, $value, $appendGlue = '') {
-               // Debug message
+       protected final function appendStringToGenericArrayKey (string $keyGroup, string $subGroup, $key, string $value, string $appendGlue = '') {
+               // Check parameter
                //* NOISY-DEBUG: */ if (!is_object($value)) $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ',value[' . gettype($value) . ']=' . print_r($value, true) . ',appendGlue=' . $appendGlue);
+               if (empty($keyGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "keyGroup" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (empty($subGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "subGroup" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (empty($key)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "key" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               }
 
                // Is it already there?
                if ($this->isGenericArrayKeySet($keyGroup, $subGroup, $key)) {
                        // Append it
-                       $this->genericArray[$keyGroup][$subGroup][$key] .= $appendGlue . (string) $value;
+                       $this->genericArray[$keyGroup][$subGroup][$key] .= $appendGlue . $value;
                } else {
                        // Add it
-                       $this->genericArray[$keyGroup][$subGroup][$key] = (string) $value;
+                       $this->genericArray[$keyGroup][$subGroup][$key] = $value;
                }
        }
 
@@ -1656,39 +1233,35 @@ Loaded includes:
         * @param       $element        Element to check
         * @param       $value          Value to add/append
         * @return      void
+        * @throws      InvalidArgumentException        If a parameter is not valid
         */
-       protected final function appendStringToGenericArrayElement ($keyGroup, $subGroup, $key, $element, $value, $appendGlue = '') {
-               // Debug message
+       protected final function appendStringToGenericArrayElement (string $keyGroup, string $subGroup, string $key, string $element, string $value, string $appendGlue = '') {
+               // Check parameter
                //* NOISY-DEBUG: */ if (!is_object($value)) $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ',element=' . $element . ',value[' . gettype($value) . ']=' . print_r($value, true) . ',appendGlue=' . $appendGlue);
+               if (empty($keyGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "keyGroup" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (empty($subGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "subGroup" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (empty($key)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "key" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif ($element === '') {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "element" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               }
 
                // Is it already there?
                if ($this->isGenericArrayElementSet($keyGroup, $subGroup, $key, $element)) {
                        // Append it
-                       $this->genericArray[$keyGroup][$subGroup][$key][$element] .= $appendGlue . (string) $value;
+                       $this->genericArray[$keyGroup][$subGroup][$key][$element] .= $appendGlue . $value;
                } else {
                        // Add it
-                       $this->setStringGenericArrayElement($keyGroup, $subGroup, $key, $element, $value);
+                       $this->setGenericArrayElement($keyGroup, $subGroup, $key, $element, $value);
                }
        }
 
-       /**
-        * Sets a string in a given generic array element
-        *
-        * @param       $keyGroup       Main group for the key
-        * @param       $subGroup       Sub group for the key
-        * @param       $key            Key to unset
-        * @param       $element        Element to check
-        * @param       $value          Value to add/append
-        * @return      void
-        */
-       protected final function setStringGenericArrayElement ($keyGroup, $subGroup, $key, $element, $value, $appendGlue = '') {
-               // Debug message
-               //* NOISY-DEBUG: */ if (!is_object($value)) $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ',element=' . $element . ',value[' . gettype($value) . ']=' . print_r($value, true) . ',appendGlue=' . $appendGlue);
-
-               // Set it
-               $this->genericArray[$keyGroup][$subGroup][$key][$element] = (string) $value;
-       }
-
        /**
         * Initializes given generic array group
         *
@@ -1697,20 +1270,25 @@ Loaded includes:
         * @param       $key            Key to use
         * @param       $forceInit      Optionally force initialization
         * @return      void
+        * @throws      InvalidArgumentException        If a parameter is not valid
+        * @throws      BadMethodCallException  If key/sub group has already been initialized
         */
-       protected final function initGenericArrayGroup ($keyGroup, $subGroup, $forceInit = false) {
-               // Debug message
+       protected final function initGenericArrayGroup (string $keyGroup, string $subGroup, bool $forceInit = false) {
+               // Check parameter
                //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',forceInit=' . intval($forceInit));
-
-               // Is it already set?
-               if (($forceInit === false) && ($this->isGenericArrayGroupSet($keyGroup, $subGroup))) {
+               if (empty($keyGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "keyGroup" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (empty($subGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "subGroup" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (($forceInit === false) && ($this->isGenericArrayGroupSet($keyGroup, $subGroup))) {
                        // Already initialized
-                       trigger_error(__METHOD__ . ':keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ' already initialized.');
-                       exit;
-               } // END - if
+                       throw new BadMethodCallException(sprintf('keyGroup=%s,subGroup=%s already initialized.', $keyGroup, $subGroup));
+               }
 
                // Initialize it
-               $this->genericArray[$keyGroup][$subGroup] = array();
+               $this->genericArray[$keyGroup][$subGroup] = [];
        }
 
        /**
@@ -1721,20 +1299,28 @@ Loaded includes:
         * @param       $key            Key to use
         * @param       $forceInit      Optionally force initialization
         * @return      void
+        * @throws      InvalidArgumentException        If a parameter is not valid
+        * @throws      BadMethodCallException  If key/sub group has already been initialized
         */
-       protected final function initGenericArrayKey ($keyGroup, $subGroup, $key, $forceInit = false) {
-               // Debug message
+       protected final function initGenericArrayKey (string $keyGroup, string $subGroup, $key, bool $forceInit = false) {
+               // Check parameter
                //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ',forceInit=' . intval($forceInit));
-
-               // Is it already set?
-               if (($forceInit === false) && ($this->isGenericArrayKeySet($keyGroup, $subGroup, $key))) {
+               if (empty($keyGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "keyGroup" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (empty($subGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "subGroup" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (empty($key)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "key" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (($forceInit === false) && ($this->isGenericArrayKeySet($keyGroup, $subGroup, $key))) {
                        // Already initialized
-                       trigger_error(__METHOD__ . ':keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ' already initialized.');
-                       exit;
-               } // END - if
+                       throw new BadMethodCallException(sprintf('keyGroup=%s,subGroup=%s,key[%s]=%s already initialized.', $keyGroup, $subGroup, gettype($key), $key));
+               }
 
                // Initialize it
-               $this->genericArray[$keyGroup][$subGroup][$key] = array();
+               $this->genericArray[$keyGroup][$subGroup][$key] = [];
        }
 
        /**
@@ -1746,40 +1332,59 @@ Loaded includes:
         * @param       $element        Element to use
         * @param       $forceInit      Optionally force initialization
         * @return      void
+        * @throws      InvalidArgumentException        If a parameter is not valid
+        * @throws      BadMethodCallException  If key/sub group isn't there but this method is invoked
         */
-       protected final function initGenericArrayElement ($keyGroup, $subGroup, $key, $element, $forceInit = false) {
-               // Debug message
+       protected final function initGenericArrayElement (string $keyGroup, string $subGroup, string $key, string $element, bool $forceInit = false) {
+               // Check parameter
                //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ',element=' . $element . ',forceInit=' . intval($forceInit));
-
-               // Is it already set?
-               if (($forceInit === false) && ($this->isGenericArrayElementSet($keyGroup, $subGroup, $key, $element))) {
+               if (empty($keyGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "keyGroup" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (empty($subGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "subGroup" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (empty($key)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "key" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif ($element === '') {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "element" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (($forceInit === false) && ($this->isGenericArrayElementSet($keyGroup, $subGroup, $key, $element))) {
                        // Already initialized
-                       trigger_error(__METHOD__ . ':keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ',element=' . $element . ' already initialized.');
-                       exit;
-               } // END - if
+                       throw new BadMethodCallException(sprintf('keyGroup=%s,subGroup=%s,key[%s]=%s,element[%s]=%s already initialized.', $keyGroup, $subGroup, gettype($key), $key, gettype($element), $element));
+               }
 
                // Initialize it
-               $this->genericArray[$keyGroup][$subGroup][$key][$element] = array();
+               $this->genericArray[$keyGroup][$subGroup][$key][$element] = [];
        }
 
        /**
-        * Pushes an element to a generic key
+        * Pushes an element to a generic key. If the key isn't found, it will be initialized.
         *
         * @param       $keyGroup       Main group for the key
         * @param       $subGroup       Sub group for the key
         * @param       $key            Key to use
         * @param       $value          Value to add/append
         * @return      $count          Number of array elements
+        * @throws      InvalidArgumentException        If a parameter is not valid
         */
-       protected final function pushValueToGenericArrayKey ($keyGroup, $subGroup, $key, $value) {
-               // Debug message
+       protected final function pushValueToGenericArrayKey (string $keyGroup, string $subGroup, string $key, $value) {
+               // Check parameter
                //* NOISY-DEBUG: */ if (!is_object($value)) $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ',value[' . gettype($value) . ']=' . print_r($value, true));
-
-               // Is it set?
-               if (!$this->isGenericArrayKeySet($keyGroup, $subGroup, $key)) {
+               if (empty($keyGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "keyGroup" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (empty($subGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "subGroup" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (empty($key)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "key" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (!$this->isGenericArrayKeySet($keyGroup, $subGroup, $key)) {
                        // Initialize array
                        $this->initGenericArrayKey($keyGroup, $subGroup, $key);
-               } // END - if
+               }
 
                // Then push it
                $count = array_push($this->genericArray[$keyGroup][$subGroup][$key], $value);
@@ -1791,7 +1396,7 @@ Loaded includes:
        }
 
        /**
-        * Pushes an element to a generic array element
+        * Pushes an element to a generic array element. If the key isn't found, it will be initialized.
         *
         * @param       $keyGroup       Main group for the key
         * @param       $subGroup       Sub group for the key
@@ -1799,16 +1404,27 @@ Loaded includes:
         * @param       $element        Element to check
         * @param       $value          Value to add/append
         * @return      $count          Number of array elements
+        * @throws      InvalidArgumentException        If a parameter is not valid
         */
-       protected final function pushValueToGenericArrayElement ($keyGroup, $subGroup, $key, $element, $value) {
-               // Debug message
+       protected final function pushValueToGenericArrayElement (string $keyGroup, string $subGroup, string $key, string $element, $value) {
+               // Check parameter
                //* NOISY-DEBUG: */ if (!is_object($value)) $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ',element=' . $element . ',value[' . gettype($value) . ']=' . print_r($value, true));
-
-               // Is it set?
-               if (!$this->isGenericArrayElementSet($keyGroup, $subGroup, $key, $element)) {
+               if (empty($keyGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "keyGroup" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (empty($subGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "subGroup" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (empty($key)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "key" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif ($element === '') {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "element" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (!$this->isGenericArrayElementSet($keyGroup, $subGroup, $key, $element)) {
                        // Initialize array
                        $this->initGenericArrayElement($keyGroup, $subGroup, $key, $element);
-               } // END - if
+               }
 
                // Then push it
                $count = array_push($this->genericArray[$keyGroup][$subGroup][$key][$element], $value);
@@ -1826,17 +1442,25 @@ Loaded includes:
         * @param       $subGroup       Sub group for the key
         * @param       $key            Key to unset
         * @return      $value          Last "popped" value
+        * @throws      InvalidArgumentException        If a parameter is not valid
+        * @throws      BadMethodCallException  If key/sub group isn't there but this method is invoked
         */
-       protected final function popGenericArrayElement ($keyGroup, $subGroup, $key) {
-               // Debug message
+       protected final function popGenericArrayElement (string $keyGroup, string $subGroup, string $key) {
+               // Check parameter
                //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key);
-
-               // Is it set?
-               if (!$this->isGenericArrayKeySet($keyGroup, $subGroup, $key)) {
+               if (empty($keyGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "keyGroup" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (empty($subGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "subGroup" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (empty($key)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "key" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (!$this->isGenericArrayKeySet($keyGroup, $subGroup, $key)) {
                        // Not found
-                       trigger_error(__METHOD__ . ': keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ' not found.');
-                       exit;
-               } // END - if
+                       throw new BadMethodCallException(sprintf('keyGroup=%s,subGroup=%s,key[%s]=%s not found.', $keyGroup, $subGroup, gettype($key), $key));
+               }
 
                // Then "pop" it
                $value = array_pop($this->genericArray[$keyGroup][$subGroup][$key]);
@@ -1853,18 +1477,26 @@ Loaded includes:
         * @param       $keyGroup       Main group for the key
         * @param       $subGroup       Sub group for the key
         * @param       $key            Key to unset
-        * @return      $value          Last "popped" value
+        * @return      $value          Last "shifted" value
+        * @throws      InvalidArgumentException        If a parameter is not valid
+        * @throws      BadMethodCallException  If key/sub group isn't there but this method is invoked
         */
-       protected final function shiftGenericArrayElement ($keyGroup, $subGroup, $key) {
-               // Debug message
+       protected final function shiftGenericArrayElement (string $keyGroup, string $subGroup, string $key) {
+               // Check parameter
                //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key);
-
-               // Is it set?
-               if (!$this->isGenericArrayKeySet($keyGroup, $subGroup, $key)) {
+               if (empty($keyGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "keyGroup" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (empty($subGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "subGroup" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (empty($key)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "key" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (!$this->isGenericArrayKeySet($keyGroup, $subGroup, $key)) {
                        // Not found
-                       trigger_error(__METHOD__ . ': keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ' not found.');
-                       exit;
-               } // END - if
+                       throw new BadMethodCallException(sprintf('keyGroup=%s,subGroup=%s,key[%s]=%s not found.', $keyGroup, $subGroup, gettype($key), $key));
+               }
 
                // Then "shift" it
                $value = array_shift($this->genericArray[$keyGroup][$subGroup][$key]);
@@ -1880,25 +1512,25 @@ Loaded includes:
         *
         * @param       $keyGroup       Main group for the key
         * @return      $count          Count of given group
+        * @throws      InvalidArgumentException        If a parameter is not valid
+        * @throws      BadMethodCallException  If key group isn't there but this method is invoked
         */
-       protected final function countGenericArray ($keyGroup) {
-               // Debug message
+       protected final function countGenericArray (string $keyGroup) {
+               // Check parameter
                //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup);
-
-               // Is it there?
-               if (!isset($this->genericArray[$keyGroup])) {
-                       // Abort here
-                       trigger_error(__METHOD__ . ': keyGroup=' . $keyGroup . ' not found.');
-                       exit;
-               } // END - if
+               if (empty($keyGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "keyGroup" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (!isset($this->genericArray[$keyGroup])) {
+                       // Not found
+                       throw new BadMethodCallException(sprintf('keyGroup=%s not found.', $keyGroup));
+               }
 
                // Then count it
                $count = count($this->genericArray[$keyGroup]);
 
-               // Debug message
-               //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',count=' . $count);
-
                // Return it
+               //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',count=' . $count);
                return $count;
        }
 
@@ -1908,25 +1540,28 @@ Loaded includes:
         * @param       $keyGroup       Main group for the key
         * @param       $subGroup       Sub group for the key
         * @return      $count          Count of given group
+        * @throws      InvalidArgumentException        If a parameter is not valid
+        * @throws      BadMethodCallException  If key/sub group isn't there but this method is invoked
         */
-       protected final function countGenericArrayGroup ($keyGroup, $subGroup) {
-               // Debug message
+       protected final function countGenericArrayGroup (string $keyGroup, string $subGroup) {
+               // Check parameter
                //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup);
-
-               // Is it there?
-               if (!$this->isGenericArrayGroupSet($keyGroup, $subGroup)) {
+               if (empty($keyGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "keyGroup" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (empty($subGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "subGroup" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (!$this->isGenericArrayGroupSet($keyGroup, $subGroup)) {
                        // Abort here
-                       trigger_error(__METHOD__ . ': keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ' not found.');
-                       exit;
-               } // END - if
+                       throw new BadMethodCallException(sprintf('keyGroup=%s,subGroup=%s not found.', $keyGroup, $subGroup));
+               }
 
                // Then count it
                $count = count($this->genericArray[$keyGroup][$subGroup]);
 
-               // Debug message
-               //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',count=' . $count);
-
                // Return it
+               //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',count=' . $count);
                return $count;
        }
 
@@ -1935,31 +1570,36 @@ Loaded includes:
         *
         * @param       $keyGroup       Main group for the key
         * @param       $subGroup       Sub group for the key
-        * @para        $key            Key to count
+        * @param       $key            Key to count
         * @return      $count          Count of given key
+        * @throws      InvalidArgumentException        If a parameter is not valid
+        * @throws      BadMethodCallException  If key/sub group isn't there but this method is invoked
         */
-       protected final function countGenericArrayElements ($keyGroup, $subGroup, $key) {
-               // Debug message
+       protected final function countGenericArrayElements (string $keyGroup, string $subGroup, string $key) {
+               // Check parameter
                //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key);
-
-               // Is it there?
-               if (!$this->isGenericArrayKeySet($keyGroup, $subGroup, $key)) {
+               if (empty($keyGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "keyGroup" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (empty($subGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "subGroup" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (empty($key)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "key" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (!$this->isGenericArrayKeySet($keyGroup, $subGroup, $key)) {
                        // Abort here
-                       trigger_error(__METHOD__ . ': keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ' not found.');
-                       exit;
+                       throw new BadMethodCallException(sprintf('keyGroup=%s,subGroup=%s,key[%s]=%s not found.', $keyGroup, $subGroup, gettype($key), $key));
                } elseif (!$this->isValidGenericArrayGroup($keyGroup, $subGroup)) {
                        // Not valid
-                       trigger_error(__METHOD__ . ': keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ' is not an array.');
-                       exit;
+                       throw new BadMethodCallException(sprintf('keyGroup=%s,subGroup=%s is not a valid key/sub group.', $keyGroup, $subGroup));
                }
 
                // Then count it
                $count = count($this->genericArray[$keyGroup][$subGroup][$key]);
 
-               // Debug message
-               //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ',count=' . $count);
-
                // Return it
+               //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ',count=' . $count);
                return $count;
        }
 
@@ -1968,17 +1608,19 @@ Loaded includes:
         *
         * @param       $keyGroup       Key group to get
         * @return      $array          Whole generic array group
+        * @throws      InvalidArgumentException        If a parameter is not valid
+        * @throws      BadMethodCallException  If key/sub group isn't there but this method is invoked
         */
-       protected final function getGenericArray ($keyGroup) {
-               // Debug message
+       protected final function getGenericArray (string $keyGroup) {
+               // Check parameters
                //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup);
-
-               // Is it there?
-               if (!isset($this->genericArray[$keyGroup])) {
+               if (empty($keyGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "keyGroup" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (!isset($this->genericArray[$keyGroup])) {
                        // Then abort here
-                       trigger_error(__METHOD__ . ': keyGroup=' . $keyGroup . ' does not exist.');
-                       exit;
-               } // END - if
+                       throw new BadMethodCallException(sprintf('keyGroup=%s not found', $keyGroup));
+               }
 
                // Return it
                return $this->genericArray[$keyGroup];
@@ -1992,10 +1634,25 @@ Loaded includes:
         * @param       $key            Key to unset
         * @param       $value          Mixed value from generic array element
         * @return      void
+        * @throws      InvalidArgumentException        If a parameter is not valid
+        * @throws      BadMethodCallException  If key/sub group isn't there but this method is invoked
         */
-       protected final function setGenericArrayKey ($keyGroup, $subGroup, $key, $value) {
-               // Debug message
+       protected final function setGenericArrayKey (string $keyGroup, string $subGroup, string $key, $value) {
+               // Check parameters
                //* NOISY-DEBUG: */ if (!is_object($value)) $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ',value[' . gettype($value) . ']=' . print_r($value, true));
+               if (empty($keyGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "keyGroup" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (empty($subGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "subGroup" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (empty($key)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "key" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (!$this->isValidGenericArrayGroup($keyGroup, $subGroup)) {
+                       // Then abort here
+                       throw new BadMethodCallException(sprintf('keyGroup=%s,subGroup=%s not found', $keyGroup));
+               }
 
                // Set value here
                $this->genericArray[$keyGroup][$subGroup][$key] = $value;
@@ -2008,17 +1665,25 @@ Loaded includes:
         * @param       $subGroup       Sub group for the key
         * @param       $key            Key to unset
         * @return      $value          Mixed value from generic array element
+        * @throws      InvalidArgumentException        If a parameter is not valid
+        * @throws      BadMethodCallException  If key/sub group isn't there but this method is invoked
         */
-       protected final function getGenericArrayKey ($keyGroup, $subGroup, $key) {
-               // Debug message
+       protected final function getGenericArrayKey (string $keyGroup, string $subGroup, string $key) {
+               // Check parameters
                //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key);
-
-               // Is it there?
-               if (!$this->isGenericArrayKeySet($keyGroup, $subGroup, $key)) {
+               if (empty($keyGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "keyGroup" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (empty($subGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "subGroup" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (empty($key)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "key" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (!$this->isGenericArrayKeySet($keyGroup, $subGroup, $key)) {
                        // Then abort here
-                       trigger_error(__METHOD__ . ': keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ' does not exist.');
-                       exit;
-               } // END - if
+                       throw new BadMethodCallException(sprintf('keyGroup=%s,subGroup=%s,key[%s]=%s not found.', $keyGroup, $subGroup, gettype($key), $key));
+               }
 
                // Return it
                return $this->genericArray[$keyGroup][$subGroup][$key];
@@ -2033,10 +1698,27 @@ Loaded includes:
         * @param       $element        Element to set
         * @param       $value          Value to set
         * @return      void
+        * @throws      InvalidArgumentException        If a parameter is not valid
         */
-       protected final function setGenericArrayElement ($keyGroup, $subGroup, $key, $element, $value) {
-               // Debug message
+       protected final function setGenericArrayElement (string $keyGroup, string $subGroup, string $key, string $element, $value) {
+               // Check parameter
                //* NOISY-DEBUG: */ if (!is_object($value)) $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ',element=' . $element . ',value[' . gettype($value) . ']=' . print_r($value, true));
+               if (empty($keyGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "keyGroup" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (empty($subGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "subGroup" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (empty($key)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "key" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif ($element === '') {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "element" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (!$this->isGenericArrayElementSet($keyGroup, $subGroup, $key, $element)) {
+                       // Initialize array
+                       $this->initGenericArrayElement($keyGroup, $subGroup, $key, $element);
+               }
 
                // Then set it
                $this->genericArray[$keyGroup][$subGroup][$key][$element] = $value;
@@ -2050,17 +1732,28 @@ Loaded includes:
         * @param       $key            Key to look for
         * @param       $element        Element to look for
         * @return      $value          Mixed value from generic array element
+        * @throws      InvalidArgumentException        If a parameter is not valid
+        * @throws      BadMethodCallException  If key/sub group isn't there but this method is invoked
         */
-       protected final function getGenericArrayElement ($keyGroup, $subGroup, $key, $element) {
-               // Debug message
+       protected final function getGenericArrayElement (string $keyGroup, string $subGroup, string $key, string $element) {
+               // Check parameter
                //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ',element=' . $element);
-
-               // Is it there?
-               if (!$this->isGenericArrayElementSet($keyGroup, $subGroup, $key, $element)) {
+               if (empty($keyGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "keyGroup" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (empty($subGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "subGroup" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (empty($key)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "key" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif ($element === '') {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "element" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (!$this->isGenericArrayElementSet($keyGroup, $subGroup, $key, $element)) {
                        // Then abort here
-                       trigger_error(__METHOD__ . ': keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ',element=' . $element . ' does not exist.');
-                       exit;
-               } // END - if
+                       throw new BadMethodCallException(sprintf('keyGroup=%s,subGroup=%s,key[%s]=%s,element[%s]=%s not found.', $keyGroup, $subGroup, gettype($key), $key, gettype($element), $element));
+               }
 
                // Return it
                return $this->genericArray[$keyGroup][$subGroup][$key][$element];
@@ -2072,10 +1765,18 @@ Loaded includes:
         * @param       $keyGroup       Key group to get
         * @param       $subGroup       Sub group for the key
         * @return      $isValid        Whether given sub group is valid
+        * @throws      InvalidArgumentException        If a parameter is not valid
         */
-       protected final function isValidGenericArrayGroup ($keyGroup, $subGroup) {
-               // Debug message
+       protected final function isValidGenericArrayGroup (string $keyGroup, string $subGroup) {
+               // Check parameter
                //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup);
+               if (empty($keyGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "keyGroup" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (empty($subGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "subGroup" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               }
 
                // Determine it
                $isValid = (($this->isGenericArrayGroupSet($keyGroup, $subGroup)) && (is_array($this->getGenericSubArray($keyGroup, $subGroup))));
@@ -2092,9 +1793,19 @@ Loaded includes:
         * @param       $key            Key to check
         * @return      $isValid        Whether given sub group is valid
         */
-       protected final function isValidGenericArrayKey ($keyGroup, $subGroup, $key) {
-               // Debug message
+       protected final function isValidGenericArrayKey (string $keyGroup, string $subGroup, string $key) {
+               // Check parameters
                //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key);
+               if (empty($keyGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "keyGroup" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (empty($subGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "subGroup" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (empty($key)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "key" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               }
 
                // Determine it
                $isValid = (($this->isGenericArrayKeySet($keyGroup, $subGroup, $key)) && (is_array($this->getGenericArrayKey($keyGroup, $subGroup, $key))));
@@ -2109,11 +1820,8 @@ Loaded includes:
         * @return      void
         */
        protected function initWebOutputInstance () {
-               // Get application instance
-               $applicationInstance = GenericRegistry::getRegistry()->getInstance('application');
-
                // Init web output instance
-               $outputInstance = ObjectFactory::createObjectByConfiguredName('output_class', array($applicationInstance));
+               $outputInstance = ObjectFactory::createObjectByConfiguredName('output_class');
 
                // Set it locally
                $this->setWebOutputInstance($outputInstance);
@@ -2126,9 +1834,6 @@ Loaded includes:
         * @return      $translated             Translated boolean value
         */
        public static final function translateBooleanToYesNo (bool $boolean) {
-               // Make sure it is really boolean
-               assert(is_bool($boolean));
-
                // "Translate" it
                $translated = ($boolean === true) ? 'Y' : 'N';
 
@@ -2153,7 +1858,7 @@ Loaded includes:
                if (!is_writable($basePath)) {
                        // Path is write-protected
                        throw new PathWriteProtectedException($infoInstance, self::EXCEPTION_PATH_CANNOT_BE_WRITTEN);
-               } // END - if
+               }
 
                // Add it
                $tempInstance = new SplFileInfo($basePath . DIRECTORY_SEPARATOR . $infoInstance->getBasename());
@@ -2162,7 +1867,7 @@ Loaded includes:
                if (!FrameworkBootstrap::isReachableFilePath($tempInstance)) {
                        // Not reachable
                        throw new FileIoException($tempInstance, self::EXCEPTION_FILE_NOT_REACHABLE);
-               } // END - if
+               }
 
                // Return it
                return $tempInstance;
@@ -2172,6 +1877,7 @@ Loaded includes:
         * "Getter" for a printable state name
         *
         * @return      $stateName      Name of the node's state in a printable format
+        * @todo        Move this class away from this monolithic place (not whole class is monolithic)
         */
        public final function getPrintableState () {
                // Default is 'null'
@@ -2184,7 +1890,7 @@ Loaded includes:
                if ($stateInstance instanceof Stateable) {
                        // Then use that state name
                        $stateName = $stateInstance->getStateName();
-               } // END - if
+               }
 
                // Return result
                return $stateName;