protected function _swapCase()
    {
        $coll_upper = $this->_upper()->chunk();
        $coll_original = $this->chunk();

        $out = '';

        while ($coll_original->valid()) {
            $c_upper = $coll_upper->take($coll_original->key);
            $c_orig = $coll_original->current();

            if ($c_upper->string === $c_orig->string) {
                $out .= $c_orig->lower;
            } else {
                $out .= $c_upper;
            }

            $coll_original->next();
        }

        return new S($out);
    }