From: Emiel van de Laar Date: 2006-02-22T19:57:58+09:00 Subject: Module#define_method "send hack" fails with Ruby 1.9 Hi List, In trying to get rubygems working with 1.9 I ran accross an error regarding the method "Module#define_method". Investigating further using the ri documentation I found out that the sample code (specifically the "send hack") doesn't work anymore with 1.9. Can someone give me an indication of how things have changed. Perhaps then we can update the documentation as well. Thanks in advance. Regards, Emiel van de Laar spitfire% ~/usr/bin/ri -v define_method ri v1.0.1 - 20041108 spitfire% ~/usr/bin/ri define_method --------------------------------------------------- Module#define_method define_method(symbol, method) => new_method define_method(symbol) { block } => proc ------------------------------------------------------------------------ Defines an instance method in the receiver. The _method_ parameter can be a +Proc+ or +Method+ object. If a block is specified, it is used as the method body. This block is evaluated using +instance_eval+, a point that is tricky to demonstrate because +define_method+ is private. (This is why we resort to the +send+ hack in this example.) class A def fred puts "In Fred" end def create_method(name, &block) self.class.send(:define_method, name, &block) end define_method(:wilma) { puts "Charge it!" } end class B < A define_method(:barney, instance_method(:fred)) end a = B.new a.barney a.wilma a.create_method(:betty) { p self } a.betty _produces:_ In Fred Charge it! # spitfire% cat define_method_example.rb class A def fred puts "In Fred" end def create_method(name, &block) self.class.send(:define_method, name, &block) end define_method(:wilma) { puts "Charge it!" } end class B < A define_method(:barney, instance_method(:fred)) end a = B.new a.barney a.wilma a.create_method(:betty) { p self } a.betty spitfire% ruby -v define_method_example.rb ruby 1.8.4 (2005-12-24) [i386-freebsd5] In Fred Charge it! # spitfire% ~/usr/bin/ruby -v define_method_example.rb ruby 1.9.0 (2006-02-22) [i386-freebsd5.3] In Fred Charge it! define_method_example.rb:6:in `Kernel#send': private method `define_method' called for B:Class (NoMethodError) from define_method_example.rb:6:in `A#create_method' from define_method_example.rb:19