Jim Weirich wrote:

>Zach Dennis said:
>  
>
>>Also with the with block being how Jamis Buck and David A. Black posted
>>it works nice with methods as well.
>>
>>def talk
>>    puts "i'm talking"
>>end
>>
>>def Test
>>    def test
>>       puts "i'm testing"
>>    end
>>end
>>
>>t = Test.new
>>with t do
>>    talk
>>    test
>>end
>>
>>'talk' is called correctly because it is in the current scope of the
>>*with* block and 'test' is called correctly because it exists on object
>>'t'.
>>    
>>
>
>The above works, but some very similar code is broken ... For example:
>  class Test
>    def test
>      puts "i'm testing"
>    end
>  end
>
>  class Dog
>    def talk
>      puts "i'm talking"
>    end
>
>    def testing_dog
>      talk             # Class Dog#talk
>      t = Test.new
>      with t do
>        test           # Calls Test#test
>        talk           # ERROR: undefined local variable or method `talk'
>      end
>    end
>  end
>
>This is because the second call to talk is not evaluated in the lexical
>scope of the calling object Dog, but within the scope of the Test object. 
>Dog#talk exists, but Test#talk does not.  (Your example missed the problem
>by putting +talk+ into the global scope.
>
>There is an awkward work around.  First write +with+ like this:
>
>  module Kernel
>    def with(obj, &block)
>      obj.instance_eval { @self = eval("self", block) }
>      obj.instance_eval &block
>    end
>  end
>
>Then reference Dog#talk like this ...
>
>  class Dog
>    def talk
>      puts "i'm talking"
>    end
>
>    def testing_dog
>      talk             # Class Dog#talk
>      t = Test.new
>      with t do
>        test           # Calls Test#test
>        @self.talk     # Calls Dog#talk
>      end
>    end
>  end
>
>
>  
>
I see what you mean, I like your solution. It seems quite elegant! What 
are your thoughts on an RCR for this functionality Jim?

Zach