public function implode($sep = '')
    {
        self::mustBeString($sep, 'Separator');

        $sep = "$sep";
        $arr = $this->value;

        foreach ($this->value as $idx => $item) {
            if(
                is_scalar($item)
                ||
                is_array($item)
                ||
                $item instanceof A
                ||
                $item instanceof H
                ||
                (is_object($item) && method_exists($item, '__toString'))
            )
            {
                if(is_array($item)){
                    $item = new A($item);
                }

                if ($item instanceof A) {
                    $arr[$idx] = $item->implode($sep);
                } elseif($item instanceof H){
                    $arr[$idx] = $item->to_a->implode($sep);
                } else {
                    continue;
                }
            } else {
                throw new \RuntimeException(
                    'Cannot convert this item to string'
                );
            }
        }

        return new S(implode($sep, $arr));
    }