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!
        #<B:0x401b39e8>

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!
#<B:0x80760d0>

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