Динамические методы импорта рубины

module DefineMethodModule
  5.times do |i|
    # Methods defined with `define_method` or `define_singleton_method`
    # do not count as methods defined in Ruby code.
    #
    # As such they can't be imported in Refinements!
    define_method :"define_method_#{i}" do
      puts "its me, the new define_method_#{i}!"
    end
  end
end

module StringEvalModule
  5.times do |i|
    # The only way to import dynamically generated methods
    # to Refinements is to construct a String with Ruby code
    # that defines the method and pass it to `eval` or `instance_eval`
    eval <<~RUBY
    	def string_eval_#{i}
        	puts "its me, the new string_eval_#{i}!"
        end
    RUBY
  end
end

module SomeRefinement
  refine String do
    # import_methods DefineMethodModule
    # the line above would result in an error
    #=> in `import_methods': Can't import method which is not defined with Ruby code
    import_methods StringEvalModule
  end
end

using SomeRefinement
string = ""
string.string_eval_3 #=> its me, the new string_eval_3!
Mateusz Drewniak