def evaluate_method(object, method, *args, &block)
case method
when Symbol
object.method(method).arity == 0 ? object.send(method, &block) : object.send(method, *args, &block)
when Proc, Method
args.unshift(object)
arity = method.arity
limit = [0, 1].include?(arity) ? arity : args.length
if block_given? && Proc === method && arity != 0
if [1, 2].include?(arity)
limit = arity
args.insert(limit - 1, block)
else
limit += 1 unless limit < 0
args.push(block)
end
end
method.call(*args[0, limit], &block)
when String
eval(method, object.instance_eval {binding}, &block)
else
raise ArgumentError, 'Methods must be a symbol denoting the method to call, a block to be invoked, or a string to be evaluated'
end
end