Yeah, thanks. I know difference between protected and private. Generally it can be summarized as: protected method require sending context to be the same type as receiver, while private requires sending context to be same instance, that's why `instance_eval` works.

But this discussion gave me an idea how to improve existing code in general and remove all protected methods:

``` ruby
  #...

  def with_proxy(proxy_hash)
    _dup_ { @proxy = proxy_hash }
  end

  private

  def _dup_(&block)
    dup { |other| other.instance_eval(&block) }
  end

  # ...
```

And headers seems like needs to be re-factored from delegator to separate class with Hash-alike methods to avoid some wtf moments regarding `#merge` etc :D