lib/phlex/unbuffered.rb
# frozen_string_literal: true module Phlex class Unbuffered < BasicObject def initialize(object) @object = object end def inspect "Unbuffered(#{@object.class.name})[object: #{@object.inspect}]" end # Borrow some important methods from Object define_method :__class__, ::Object.instance_method(:class) define_method :__public_send__, ::Object.instance_method(:public_send) def respond_to_missing?(...) @object.respond_to?(...) end def method_missing(name, *args, **kwargs, &block) if @object.respond_to?(name) __class__.define_method(name) do |*a, **k, &b| @object.capture { @object.public_send(name, *a, **k, &b) } end # Now we've defined this missing method, we can call it. __public_send__(name, *args, **kwargs, &block) else super end end # Forward some methods to the original underlying method def call(...) @object.call(...) end def send(...) @object.send(...) end def public_send(...) @object.public_send(...) end end end