When using refinements in one file, the using call needs to be physically placed before the refined method call.
For example, this works:
using Module.new {
refine Object do
def foo() p 'hello'; end
end
}
class Object
def bar() foo; end
end
Object.new.bar
but this doesn't work:
class Object
def bar() foo; end
end
using Module.new {
refine Object do
def foo() p 'hello'; end
end
}
Object.new.bar
#=> doesnot_work.rb:2:in `bar': undefined local variable or method `foo' for #<Object:0x007f8f2a0251c8> (NameError)
I know that current refinements has a unique scope called "file scope", but I don't think this is expected behavior.
At least I expect it to work so far as using is evaluated in runtime, no matter where in the file it is.
I confirmed that this reproduces in all stable versions of 2.0, 2.1, 2.2, 2.3, 2.4, and today's trunk (2.5).