public function sub($offset = 0, $limit = 1)
    {
        self::mustBeInteger($offset, 'Offset');
        self::mustBeInteger($limit, 'Limit');

        if($offset instanceof N) $offset = $offset->int;
        if($limit instanceof N) $limit = $limit->int;

        if ($offset < 0) {
            throw new \InvalidArgumentException(
                'Offset must be a null or positive integer'
            );
        }

        if ($offset >= count($this)) {
            throw new \InvalidArgumentException(
                'Offset cannot greater than the last index of the string'
            );
        }

        if ($limit < 1) {
            throw new \InvalidArgumentException(
                'Limit must be an intger equal to or greater than one.'
            );
        }

        return new S(mb_substr($this->value, $offset, $limit, C::ENCODING));
    }