Some metaprogramming with define_method

Hello,

I was hoping that the following snippet would output

  test_method

instead it raises an 'undefined method'.

  module Proxy
  
    def self.append_features(mod)
      mod.extend(ClassMethods)
    end
  
    module ClassMethods
  
      def proxy_method(name)
        self.class.send(:define_method, name) { puts "called #{name}" }
      end
  
    end
  
  end
  
  class ProxyTest
  
    include Proxy
  
    proxy_method :test_method
  
  end
  
  proxy = ProxyTest.new
  proxy.test_method

Any hints greatly appreciated.
g phil

Hello,

I was hoping that the following snippet would output

test_method

instead it raises an 'undefined method'.

module Proxy

   def self.append_features(mod)
     mod.extend(ClassMethods)
   end

   module ClassMethods

     def proxy_method(name)
       self.class.send(:define_method, name) { puts "called #{name}" }

Here you're in class scope; self points to ProxyTest. You in essense defined Class.test_method. Remove ".class", and it works.

···

On Apr 24, 2008, at 23:26, Philipp Hofmann wrote:

     end

   end

end

class ProxyTest

   include Proxy

   proxy_method :test_method

end

proxy = ProxyTest.new
proxy.test_method

Any hints greatly appreciated.
g phil