public function fetch($key, $default = null)
    {
        if ($this->hasKey($key)) {
            return $this[$key];
        } elseif ($default !== null) {
            if (is_callable($default)) {
                return $default($key);
            }

            return $default;
        }

        throw new InvalidArgumentException("Invalid key '$key'");
    }