Path: csiph.com!x330-a1.tempe.blueboxinc.net!usenet.pasdenom.info!aioe.org!feeder.news-service.com!de-l.enfer-du-nord.net!feeder1.enfer-du-nord.net!feeder2.enfer-du-nord.net!talisker.lacave.net!lacave.net!not-for-mail From: Kevin Mahler Newsgroups: comp.lang.ruby Subject: Re: looking for an "inversion" pattern Date: Fri, 15 Apr 2011 02:14:37 -0500 Organization: Service de news de lacave.net Lines: 47 Message-ID: References: NNTP-Posting-Host: bristol.highgroove.com Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Trace: talisker.lacave.net 1302851695 56891 65.111.164.187 (15 Apr 2011 07:14:55 GMT) X-Complaints-To: abuse@lacave.net NNTP-Posting-Date: Fri, 15 Apr 2011 07:14:55 +0000 (UTC) In-Reply-To: X-Received-From: This message has been automatically forwarded from the ruby-talk mailing list by a gateway at comp.lang.ruby. If it is SPAM, it did not originate at comp.lang.ruby. Please report the original sender, and not us. Thanks! For more details about this gateway, please visit: http://blog.grayproductions.net/categories/the_gateway X-Mail-Count: 381611 X-Ml-Name: ruby-talk X-Rubymirror: Yes X-Ruby-Talk: Xref: x330-a1.tempe.blueboxinc.net comp.lang.ruby:2921 Fearless Fool wrote in post #992929: > I'd like to create a method +foo+ that transforms: > > my_obj.foo.some_method(*args) > > to > > MyClass.some_method(my_obj, *args) class MyClass def self.some_method(obj, *args) puts "MyClass.some_method:" puts "obj: #{obj.inspect}" puts "args: #{args.inspect}" end end def define_foo(obj, clazz, method) obj.singleton_class.class_eval do define_method :foo do Class.new do define_method method do |*args| clazz.send(method, obj, *args) end end.new end end end my_obj = "my_obj thing" args = [1,2,3] define_foo(my_obj, MyClass, :some_method) my_obj.foo.some_method(*args) # => # MyClass.some_method: # obj: "my_obj thing" # args: [1, 2, 3] Returning facade or proxy objects like this can be an elegant solution to certain problems. It's rather high on the abstraction ladder, though, and without knowing the context I would wonder if more direct solutions are possible. -- Posted via http://www.ruby-forum.com/.