]> git.mxchange.org Git - core.git/blobdiff - framework/main/classes/class_BaseFrameworkSystem.php
Continued:
[core.git] / framework / main / classes / class_BaseFrameworkSystem.php
index 6810e7244d653fb908b8accf5138b3e2ffdb4190..a22be776047b4fd5dac3ffffe534344297d79302 100644 (file)
@@ -4,9 +4,9 @@ namespace Org\Mxchange\CoreFramework\Object;
 
 // Import framework stuff
 use Org\Mxchange\CoreFramework\Bootstrap\FrameworkBootstrap;
-use Org\Mxchange\CoreFramework\Criteria\Criteria;
 use Org\Mxchange\CoreFramework\EntryPoint\ApplicationEntryPoint;
 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;
@@ -19,13 +19,14 @@ use Org\Mxchange\CoreFramework\Registry\GenericRegistry;
 use Org\Mxchange\CoreFramework\Result\Database\CachedDatabaseResult;
 use Org\Mxchange\CoreFramework\State\Stateable;
 use Org\Mxchange\CoreFramework\Stream\Output\OutputStreamer;
-use Org\Mxchange\CoreFramework\Utils\String\StringUtils;
+use Org\Mxchange\CoreFramework\Utils\Strings\StringUtils;
 
 // Import SPL stuff
-use \stdClass;
+use \BadMethodCallException;
 use \InvalidArgumentException;
 use \ReflectionClass;
 use \SplFileInfo;
+use \stdClass;
 
 /**
  * The simulator system class is the super class of all other classes. This
@@ -33,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
  *
@@ -52,14 +53,18 @@ 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 $selfInstance = NULL;
+       private static $stubMethods = [
+               'partialStub' => true,
+               '__call' => true,
+               '__callStatic' => true,
+       ];
 
        /**
         * The real class name
@@ -126,24 +131,23 @@ abstract class BaseFrameworkSystem extends stdClass implements FrameworkInterfac
        const EXCEPTION_ATTRIBUTES_ARE_MISSING       = 0x02b;
        const EXCEPTION_ARRAY_ELEMENTS_MISSING       = 0x02c;
        const EXCEPTION_TEMPLATE_ENGINE_UNSUPPORTED  = 0x02d;
-       const EXCEPTION_UNSPPORTED_OPERATION         = 0x02e;
-       const EXCEPTION_FACTORY_REQUIRE_PARAMETER    = 0x02f;
-       const EXCEPTION_MISSING_ELEMENT              = 0x030;
-       const EXCEPTION_HEADERS_ALREADY_SENT         = 0x031;
-       const EXCEPTION_DEFAULT_CONTROLLER_GONE      = 0x032;
-       const EXCEPTION_CLASS_NOT_FOUND              = 0x033;
-       const EXCEPTION_REQUIRED_INTERFACE_MISSING   = 0x034;
-       const EXCEPTION_FATAL_ERROR                  = 0x035;
-       const EXCEPTION_FILE_NOT_FOUND               = 0x036;
-       const EXCEPTION_ASSERTION_FAILED             = 0x037;
-       const EXCEPTION_FILE_NOT_REACHABLE           = 0x038;
-       const EXCEPTION_FILE_CANNOT_BE_READ          = 0x039;
-       const EXCEPTION_FILE_CANNOT_BE_WRITTEN       = 0x03a;
-       const EXCEPTION_PATH_CANNOT_BE_WRITTEN       = 0x03b;
-       const EXCEPTION_DATABASE_UPDATED_NOT_ALLOWED = 0x03c;
-       const EXCEPTION_FILTER_CHAIN_INTERCEPTED     = 0x03d;
-       const EXCEPTION_INVALID_SOCKET               = 0x03e;
-       const EXCEPTION_SELF_INSTANCE                = 0x03f;
+       const EXCEPTION_FACTORY_REQUIRE_PARAMETER    = 0x02e;
+       const EXCEPTION_MISSING_ELEMENT              = 0x02f;
+       const EXCEPTION_HEADERS_ALREADY_SENT         = 0x030;
+       const EXCEPTION_DEFAULT_CONTROLLER_GONE      = 0x031;
+       const EXCEPTION_CLASS_NOT_FOUND              = 0x032;
+       const EXCEPTION_REQUIRED_INTERFACE_MISSING   = 0x033;
+       const EXCEPTION_FATAL_ERROR                  = 0x034;
+       const EXCEPTION_FILE_NOT_FOUND               = 0x035;
+       const EXCEPTION_ASSERTION_FAILED             = 0x036;
+       const EXCEPTION_FILE_NOT_REACHABLE           = 0x037;
+       const EXCEPTION_FILE_CANNOT_BE_READ          = 0x038;
+       const EXCEPTION_FILE_CANNOT_BE_WRITTEN       = 0x039;
+       const EXCEPTION_PATH_CANNOT_BE_WRITTEN       = 0x03a;
+       const EXCEPTION_DATABASE_UPDATED_NOT_ALLOWED = 0x03b;
+       const EXCEPTION_FILTER_CHAIN_INTERCEPTED     = 0x03c;
+       const EXCEPTION_INVALID_SOCKET               = 0x03d;
+       const EXCEPTION_SELF_INSTANCE                = 0x03e;
 
        /**
         * Startup time in miliseconds
@@ -350,7 +354,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__], FrameworkInterface::EXCEPTION_UNSPPORTED_OPERATION);
        }
 
        /**
@@ -360,7 +364,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__], FrameworkInterface::EXCEPTION_UNSPPORTED_OPERATION);
        }
 
        /**
@@ -370,7 +374,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__], FrameworkInterface::EXCEPTION_UNSPPORTED_OPERATION);
        }
 
        /**
@@ -400,11 +404,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');
        }
 
        /**
@@ -423,8 +423,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;
+               return GenericRegistry::getRegistry()->getInstance('web_output');
        }
 
        /**
@@ -539,25 +538,6 @@ Loaded includes:
                ));
        }
 
-       /**
-        * Replaces control characters with printable output
-        *
-        * @param       $str    String with control characters
-        * @return      $str    Replaced string
-        */
-       protected function replaceControlCharacters (string $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
         *
@@ -618,8 +598,11 @@ Loaded includes:
         * @deprecated  Not fully, as the new Logger facilities are not finished yet.
         */
        public final static function createDebugInstance (string $className, int $lineNumber = NULL) {
-               // Is the instance set?
-               if (!GenericRegistry::getRegistry()->instanceExists('debug')) {
+               // 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;
 
@@ -675,7 +658,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'],
@@ -712,7 +695,7 @@ Loaded includes:
                        }
                } 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;
                        }
@@ -771,9 +754,12 @@ Loaded includes:
         * @return      $entry  An array with database entries
         * @throws      NullPointerException    If the database result is not found
         * @throws      InvalidDatabaseResultException  If the database result is invalid
-        * @todo        Monolithic method, should be moved to proper classes
+        * @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
@@ -805,8 +791,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;
 
@@ -830,7 +827,7 @@ Loaded includes:
                if ($this->isFieldSet($fieldName)) {
                        // Get it
                        $fieldValue = $fieldArray[$fieldName2];
-               } elseif (FrameworkBootstrap::getConfigurationInstance()->getConfigEntry('developer_mode_enabled')) {
+               } elseif (FrameworkBootstrap::getConfigurationInstance()->isEnabled('developer_mode')) {
                        // Missing field entry, may require debugging
                        self::createDebugInstance(__CLASS__, __LINE__)->debugOutput('BASE-FRAMEWORK-SYSTEM: fieldArray<pre>=' . print_r($fieldArray, true) . '</pre>,fieldName=' . $fieldName . ' not found!');
                } else {
@@ -848,8 +845,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();
 
@@ -882,7 +886,7 @@ Loaded includes:
         */
        public function deprecationWarning (string $message) {
                // Is developer mode active?
-               if (FrameworkBootstrap::getConfigurationInstance()->getConfigEntry('developer_mode_enabled')) {
+               if (FrameworkBootstrap::getConfigurationInstance()->isEnabled('developer_mode')) {
                        // Debug instance is there?
                        if (!is_null($this->getDebugInstance())) {
                                // Output stub message
@@ -903,8 +907,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 (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());
 
@@ -930,8 +941,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 (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;
 
@@ -959,8 +977,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 (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);
 
@@ -968,26 +993,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 = []) {
-               // 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
         *
@@ -1010,38 +1015,6 @@ Loaded includes:
                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 (string $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'));
-               }
-
-               // Return it
-               return self::$hashLength;
-       }
-
        /**
         * Determines if an element is set in the generic array
         *
@@ -1050,12 +1023,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 (string $keyGroup, string $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
@@ -1068,29 +1055,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 (string $keyGroup, string $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 (string $keyGroup, string $subGroup) {
-               // Debug message
+               // 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]);
@@ -1105,18 +1110,23 @@ 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 (string $keyGroup, string $subGroup) {
-               // Is it there?
-               if (!$this->isGenericArrayGroupSet($keyGroup, $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
-                       trigger_error(__METHOD__ . ': keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ' not found.');
-                       exit;
+                       throw new BadMethodCallException(sprintf('keyGroup=%s,subGroup=%s not found.', $keyGroup, $subGroup));
                }
 
-               // Debug message
-               //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',value=' . print_r($this->genericArray[$keyGroup][$subGroup], true));
-
                // Return it
                return $this->genericArray[$keyGroup][$subGroup];
        }
@@ -1128,10 +1138,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 (string $keyGroup, string $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]);
@@ -1145,10 +1166,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 (string $keyGroup, string $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]);
@@ -1162,18 +1197,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 (string $keyGroup, string $subGroup, $key, string $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;
                }
        }
 
@@ -1186,39 +1232,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 (string $keyGroup, string $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 (string $keyGroup, string $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
         *
@@ -1227,16 +1269,21 @@ 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 (string $keyGroup, string $subGroup, bool $forceInit = false) {
-               // Debug message
+               // 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;
+                       throw new BadMethodCallException(sprintf('keyGroup=%s,subGroup=%s already initialized.', $keyGroup, $subGroup));
                }
 
                // Initialize it
@@ -1251,16 +1298,24 @@ 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 (string $keyGroup, string $subGroup, $key, bool $forceInit = false) {
-               // Debug message
+               // 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;
+                       throw new BadMethodCallException(sprintf('keyGroup=%s,subGroup=%s,key[%s]=%s already initialized.', $keyGroup, $subGroup, gettype($key), $key));
                }
 
                // Initialize it
@@ -1276,16 +1331,27 @@ 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 (string $keyGroup, string $subGroup, $key, $element, bool $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;
+                       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
@@ -1293,20 +1359,28 @@ Loaded includes:
        }
 
        /**
-        * 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 (string $keyGroup, string $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);
                }
@@ -1321,7 +1395,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
@@ -1329,13 +1403,24 @@ 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 (string $keyGroup, string $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);
                }
@@ -1356,16 +1441,24 @@ 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 (string $keyGroup, string $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;
+                       throw new BadMethodCallException(sprintf('keyGroup=%s,subGroup=%s,key[%s]=%s not found.', $keyGroup, $subGroup, gettype($key), $key));
                }
 
                // Then "pop" it
@@ -1383,17 +1476,25 @@ 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 (string $keyGroup, string $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;
+                       throw new BadMethodCallException(sprintf('keyGroup=%s,subGroup=%s,key[%s]=%s not found.', $keyGroup, $subGroup, gettype($key), $key));
                }
 
                // Then "shift" it
@@ -1410,25 +1511,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;
+               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;
        }
 
@@ -1438,25 +1539,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 (string $keyGroup, string $subGroup) {
-               // Debug message
+               // 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;
+                       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;
        }
 
@@ -1465,31 +1569,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 (string $keyGroup, string $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;
        }
 
@@ -1498,16 +1607,18 @@ 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;
+                       throw new BadMethodCallException(sprintf('keyGroup=%s not found', $keyGroup));
                }
 
                // Return it
@@ -1522,10 +1633,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 (string $keyGroup, string $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;
@@ -1538,16 +1664,24 @@ 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 (string $keyGroup, string $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;
+                       throw new BadMethodCallException(sprintf('keyGroup=%s,subGroup=%s,key[%s]=%s not found.', $keyGroup, $subGroup, gettype($key), $key));
                }
 
                // Return it
@@ -1563,10 +1697,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 (string $keyGroup, string $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;
@@ -1580,16 +1731,27 @@ 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 (string $keyGroup, string $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;
+                       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
@@ -1602,10 +1764,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 (string $keyGroup, string $subGroup) {
-               // Debug message
+               // 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))));
@@ -1622,9 +1792,19 @@ Loaded includes:
         * @param       $key            Key to check
         * @return      $isValid        Whether given sub group is valid
         */
-       protected final function isValidGenericArrayKey (string $keyGroup, string $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))));
@@ -1653,9 +1833,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';