Skip to content

Instantly share code, notes, and snippets.

@takuma-saito
Created May 2, 2020 07:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save takuma-saito/9ed195b3ef5f2263db117b27552d18bd to your computer and use it in GitHub Desktop.
Save takuma-saito/9ed195b3ef5f2263db117b27552d18bd to your computer and use it in GitHub Desktop.
forwardable.rb
module Forwardable
def delegate_methods(obj, *methods)
methods.each {|method| delegate_method(obj, method)}
end
def delegate_method1(obj, method)
self.module_eval %Q{
def #{method}(*args, &block)
_#{obj}.#{method}(*args, &block)
end
}
end
def delegate_method2(obj, method)
self.module_eval do
define_method(method) {|*args, &block|
_ = eval("#{obj}", binding, __FILE__, __LINE__)
_.__send__(method, *args, &block)
}
end
end
alias :delegate_method :delegate_method2
end
class Impl
def self.service
puts "service!"
end
end
class MyQueue
extend Forwardable
delegate_method :Impl, :service
delegate_methods :@q, :push, :shift, :pop
def initialize()
@q = []
end
end
q = MyQueue.new
q.push 1, 2, 3, 4, 5
q.pop
q.shift
q.service
p q
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment