All based on this
require 'contextual_proc'
def doubler
ContextualProc.new { number*2 }
end
# In a completely different context
number = 4
doubler.apply(binding)
# => 8
The example above is an over-simplifed anti-pattern but it demonstrates the principle - a block suddenly gains access to the binding from which it is called