public function pluck($key_for_value, $key_for_key = null)
    {
        $map = new Map;
        $this->walk(function ($v) use ($key_for_value, $key_for_key, $map) {
            // get the key to use
            if (null === $key_for_key) {
                $key = null;
            } else if ($v->has($key_for_key)) {
                $key = $v->get($key_for_key);
            } else {
                throw new \OutOfBoundsException();
            }

            // add the value at that key, provided we have one
            if ($v->has($key_for_value)) {
                $map[$key] = $v->get($key_for_value);
            } else {
                throw new \OutOfBoundsException();
            }
        });
        return $map;
    }