def initialize(receiver, fallback)
@__receiver__ = receiver
@__fallback__ = fallback
unless fallback.respond_to?(:method_missing)
singleton_class = (class << fallback; self; end)
singleton_class.
send(:define_method, :method_missing) do |method, *args, &block|
if receiver.respond_to?(method.to_sym)
receiver.__send__(method.to_sym, *args, &block)
else
super(method, *args, &block)
end
end
singleton_class.
send(:define_method, :__docile_undo_fallback__) do
singleton_class.send(:remove_method, :method_missing)
singleton_class.send(:remove_method, :__docile_undo_fallback__)
end
end
end