public function wrap($width = 79, $cut = PHP_EOL)
    {
        self::mustBeInteger($width, 'Width');
        self::mustBeString($cut, 'Cut');

        $arr_lines = array();

        if (strlen($this->value) === count($this)) {
            $arr_lines = explode(
                $cut,
                wordwrap(
                    $this->value,
                    $width,
                    $cut
                )
            );
        } else {
            //Thanks to: http://www.php.net/manual/fr/function.wordwrap.php#104811
            $str_prov = preg_replace('/\s+/', ' ', trim($this->value));
            $int_length = mb_strlen($str_prov, C::ENCODING);
            $int_width = $width;

            if ($int_length <= $int_width) {
                return new self($str_prov);
            }

            $int_last_space = 0;
            $i = 0;

            do {
                if (mb_substr($str_prov, $i, 1, c::ENCODING) == ' ') {
                    $int_last_space = $i;
                }

                if ($i >= $int_width) {
                    if ($int_last_space == 0) {
                        $int_last_space = $int_width;
                    }

                    $arr_lines[] = trim(
                        mb_substr(
                            $str_prov,
                            0,
                            $int_last_space,
                            C::ENCODING
                        )
                    );

                    $str_prov = mb_substr(
                        $str_prov,
                        $int_last_space,
                        $int_length,
                        C::ENCODING
                    );

                    $int_length = mb_strlen($str_prov, C::ENCODING);

                    $i = 0;
                }

                $i++;
            } while ($i < $int_length);

            $arr_lines[] = trim($str_prov);
        }

        return new self(implode($cut, $arr_lines));
    }