Skip to content

Instantly share code, notes, and snippets.

@Hanmac
Forked from workmad3/hidden_proxy.rb
Last active December 11, 2015 15:18
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Hanmac/4619845 to your computer and use it in GitHub Desktop.
Save Hanmac/4619845 to your computer and use it in GitHub Desktop.
require 'delegate'
class HiddenDelegator < SimpleDelegator
def initialize(obj)
super
end
def class
__getobj__.class
end
def inspect
__getobj__.inspect
end
def method_missing(m, *a, &b)
case m.to_s
when /^(.+)!$/
m = __getobj__.respond_to?(m) ? m : $1
obj = __getobj__.send(m, *a, &b)
return nil if obj.nil?
__setobj__(obj)
return self
else
obj = super
obj.is_a?(HiddenDelegator) ? obj : HiddenDelegator.new(obj)
end
end
def to_s(*args)
HiddenDelegator.new(__getobj__.to_s(*args))
end
def is_a?(klass)
super || __getobj__.is_a?(klass)
end
def coerce(other)
[self, other]
end
end
class Module
alias _hidden_delegator_case ===
def ===(other)
_hidden_delegator_case(other) || other.is_a?(self)
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment