public static function getType($val, &$typeMore = null)
    {
        if (\is_string($val)) {
            $type = 'string';
            if (\is_numeric($val)) {
                $typeMore = 'numeric';
            } elseif ($val === self::UNDEFINED) {
                $type = 'undefined';    // not a native php type!
            } elseif ($val === self::RECURSION) {
                $type = 'recursion';    // not a native php type!
            }
        } elseif (\is_array($val)) {
            if (\in_array(self::ABSTRACTION, $val, true)) {
                $type = $val['type'];
                $typeMore = 'abstraction';
            } elseif (AbstractArray::isCallable($val)) {
                $type = 'callable';
                $typeMore = 'raw';  // needs abstracted
            } else {
                $type = 'array';
                $typeMore = 'raw';  // needs abstracted
            }
        } elseif (\is_bool($val)) {
            $type = 'bool';
            $typeMore = \json_encode($val);
        } elseif (\is_float($val)) {
            $type = 'float';
        } elseif (\is_int($val)) {
            $type = 'int';
        } elseif (\is_null($val)) {
            $type = 'null';
        } elseif (\is_object($val)) {
            $type = 'object';
            $typeMore = 'raw';  // needs abstracted
        } elseif (\is_resource($val) || \strpos(\print_r($val, true), 'Resource') === 0) {
            // is_resource() returns false for a closed resource
            // (it's also not a string)
            $type = 'resource';
            $typeMore = 'raw';  // needs abstracted
        }
        return $type;
    }