Rinda::TupleSpace を公開したくない時に不都合が

I like Ruby. - 8章 Rinda

class Server
  def initialize
    @ts = Rinda::TupleSpace.new
  end
  def get(name)
    @ts.take([name])
  end
end

DRb.start_service(nil, Server.new)

きれいなインターフェースのために、上記のようなTupleSpaceを直接公開しないコードを書きたいのだが、接続切れ対策のためTupleSpaceProxyと同じことをしようとすると困る。TupleSpaceProxyは

class TupleSpaceProxy
  def take(tuple, sec=nil, &block)
    port = []
    @ts.move(DRbObject.new(port), tuple, sec, &block)
    port[0]
  end
end

このようなことをやっていて、元のTupleSpaceとportが別々のサーバにあるので接続が切れた場合moveが失敗してくれるわけなんだけど、最初のコードのようにローカルでTupleSpaceを保持しているとそうはできない。

module Client
  def port
    DRbObject.new([])
  end
end

class Server
  def initialize
    @ts = Rinda::TupleSpace.new
  end
  def get(client, name)
    port = client.port
    @ts.move(port, [name])
    port[0]
  end
end

みたいに、takeをつかう時は必ずリモートのオブジェクトを引数に渡すように強制する、というのを考えたんだけど、ちょっと汚い感じ。引数で渡さなくても呼び出し元を特定する方法がありそうなものだけど、よくわからない。良い案はありませんか。