1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
|
module Bogus
class OverwritesMethods
extend Takes
takes :makes_substitute_methods
def overwrite(object, name)
raise "wut?" if name == :__shadow__
return if already_delegates_to_shadow?(object, name)
object.extend RecordInteractions
object.extend HasOverwritenMethods
method = method_by_name(object, name)
copy = copy(object, name)
object.__overwrite__(name, method, copy)
end
def reset(object)
return if object.is_a?(FakeObject)
object.__reset__
end
private
def already_delegates_to_shadow?(object, name)
return false unless object.is_a?(FakeObject)
!Fake.instance_methods.include?(name)
end
def method_by_name(object, name)
object.method(name) if object.methods.include?(name)
end
def copy(object, name)
method = method_by_name(object, name)
return default_method(name) unless method
makes_substitute_methods.stringify(method)
end
def default_method(name)
"def #{name}(*args, &block); __record__(:#{name}, *args, &block); end"
end
end
end
|