Issue #9005 has been updated by nobu (Nobuyoshi Nakada).

Backport set to 1.9.3: DONTNEED, 2.0.0: DONTNEED, 2.1.0: REQUIRED


----------------------------------------
Bug #9005: object.send(:define_method, ...){...} creates private method
https://bugs.ruby-lang.org/issues/9005#change-43868

Author: jeremyevans0 (Jeremy Evans)
Status: Closed
Priority: Normal
Assignee: nobu (Nobuyoshi Nakada)
Category: core
Target version: current: 2.1.0
ruby -v: ruby 2.1.0dev (2013-09-22 trunk 43011) [i386-openbsd]
Backport: 1.9.3: DONTNEED, 2.0.0: DONTNEED, 2.1.0: REQUIRED


I assume this is caused by r40022, which made define_method consider visibility.  However, visibility should only be considered if define_method is called normally, not via send. When called via send, it should define a public method.  Here's example code showing the error:

$ ruby21 -ve "Object.send(:define_method, :foo){|*a| 1}.foo"
-e:1:in `<main>': private method `foo' called for :foo:Symbol (NoMethodError)

I apologize in advance if this has already been fixed (I tested 2.1.0-preview1, not trunk), but from the commit logs it doesn't appear to have been.


-- 
http://bugs.ruby-lang.org/