metaprogramming/define_method_from_callable.rb
tests/_examples/metaprogramming/define_method_from_callable.rb in the metorex repository.
borrowed = Class.new do
def test_method(first, second)
[first, second]
end
define_method(:another_test_method, instance_method(:test_method))
end
puts borrowed.new.another_test_method(1, 2).inspect
parent = Class.new { define_method(:foo) { :bar } }
child = Class.new(parent) do
define_method(:baz, parent.instance_method(:foo))
end
puts child.new.baz.inspect
helpers = Module.new do
def from_module
:module_method
end
end
holder = Class.new do
define_method(:borrowed, helpers.instance_method(:from_module))
end
puts holder.new.borrowed.inspect
adder = Class.new do
define_method(:add, :+.to_proc)
end
puts adder.new.add(1, 2).inspect
returned = nil
Class.new do
returned = define_method(:named) { :ok }
end
puts returned.inspect
visibility = Class.new do
define_method(:public_one) { :public }
private
define_method(:private_one) { :private }
define_method(:initialize) { @ready = true }
end
puts visibility.public_instance_methods(false).sort.inspect
puts visibility.private_instance_methods(false).sort.inspect
begin
Class.new { define_method(:oops, "not callable") }
rescue TypeError => error
puts error.message
end
begin
Class.new do
freeze
define_method(:late) { :nope }
end
rescue FrozenError
puts "FrozenError"
end
Output:
[1, 2]
:bar
:module_method
3
:named
[:public_one]
[:initialize, :private_one]
wrong argument type String (expected Proc/Method/UnboundMethod)
FrozenError