Can there be a "with" construction?

Jacob Fugal wrote:

···

On 10/27/06, Gennady Bystritsky <Gennady.Bystritsky@quest.com> wrote:

matt neuburg wrote:

Some languages have a "with" construction, where undefined methods
are routed to a designated object. Here's an example from UserTalk:

with system.startup {
   string(license)
}

UserTalk knows what "string" is, but when it can't find "license" it
reinterprets it as system.startup.license, which works. In
UserTalk, you can even chain these tests:

with system.temp, system.startup {
   string(license)
}

That means we try system.temp.license and if that doesn't exist we
proceed to system.startup.license.

So my question is: is Ruby amenable to this kind of construction? Is
there a way to bend the language to that it acts like this? Thx - m.

Something like this?

def with(*objects)
  begin
    yield
  rescue NoMethodError => exception
    o = objects.detect { |_o|
      _o.respond_to? exception.name
    } or raise

    o.send exception.name, *exception.args
  end
end

It's a start, but:

1) I don't think we really want to redispatch NoMethodErrors for
messages that had an explicit receiver. Only the ones with implicit
receivers.

2) it stops execution of the block after redispatching the
first exception:

  with(Time) do
    "aaa".now
    puts "Never get here"
  end # nothing printed

Jacob Fugal

Hmm... I must have misunderstood the OP. I somehow thought that in
"those" languages string(license) translates to calling method "license"
on "string", hence the solution. My bad, sorry.

Gennady.