public function substring(int $start, int $length = null): self
    {
        if ($this->isNull()) {
            return $this;
        }

        $substring = null === $length ?
                substr($this->unveil(), $start)
              : substr($this->unveil(), $start, $length);
        if (false === $substring) {
            throw new \InvalidArgumentException(
                    'Given start offset is out of range'
            );
        }

        return self::create($substring);
    }