From: Robert Klemme Date: 2011-04-15T18:24:50+09:00 Subject: Re: looking for an "inversion" pattern On Fri, Apr 15, 2011 at 8:27 AM, Fearless Fool wrote: > Fearless Fool wrote in post #992929: >> Maybe I'm overthinking this... > > Meh.  I s'pose I can substitute an underscore for a period: > >  my_obj.foo_some_method(*args) > > ... whereupon this become a simple mixin on my_obj's class: > >  def foo_some_method(*args) { >    MyClass.some_method(self, *args) >  } > > The only potential disadvantage is that I need to write one of these for > each method.  The advantages include likely to run much faster (than > constructing lambdas or invoking method_missing processing) and possibly > easier to understand and maintain than what I was originally trying to > do. I am sorry, I still do not understand your motivation to have a class method which receives an instance as first argument. Isn't this conceptually exactly what an instance method is for? Why do you need this? If you need this as general pattern you could always do class X def method_missing(m, *a, &b) self.class.send(m, self, *a, &b) end def self.foo(obj, str) printf "%p: %s\n", obj, str end end X.new.foo 123 But I would seriously question the wisdom of this. :-) Other than that I would follow Jesus's approach to make #foo create a proxy instance. Here's another way to do it which would also allow method chaining on the proxy: class Proxy < BasicObject def initialize(orig, delegate) @orig = orig @delegate = delegate end def method_missing(m, *a, &b) res = @delegate.send(m, @orig, *a, &b) @orig.equal?(res) ? self : res end end class Object # create proxy for delegation to given # instance def proxy(delegate) Proxy.new(self, delegate) end end class YourClass def proxy super(MyClass) end end Kind regards robert -- remember.guy do |as, often| as.you_can - without end http://blog.rubybestpractices.com/