public static function assertTypeOf(string $type, $actual, string $message = '')
    {
        self::$count += 1;

        switch (strtolower($type)) {
            case 'array':
                if (is_array($actual)) {
                    return;
                }
                break;

            case 'resource':
                if (is_resource($actual)) {
                    return;
                }
                break;

            case 'object':
                if (is_object($actual)) {
                    return;
                }
                break;

            case 'int':
            case 'integer':
            case 'long':
                if (is_int($actual)) {
                    return;
                }
                break;

            case 'double':
            case 'float':
                if (is_float($actual)) {
                    return;
                }
                break;

            case 'numeric':
                if (is_numeric($actual)) {
                    return;
                }
                break;

            case 'bool':
            case 'boolean':
                if (is_bool($actual)) {
                    return;
                }
                break;

            case 'callable':
                if (is_callable($actual)) {
                    return;
                }
                break;

            case 'null':
                if (is_null($actual)) {
                    return;
                }
                break;

            case 'string':
                if (is_string($actual)) {
                    return;
                }
                break;

            default:
                throw new AssertionLogicError(sprintf('No assertion defined for type %s', $type));
        }

        if (!$message) {
            $message = sprintf(
                'Failed asserting that %s is of type %s',
                static::getType($actual),
                $type
            );
        }
        throw new AssertionError($message);
    }