module MemberEquivalence def ==(o) _true_for_all_instance_variables(:==, o) end def eql?(o) _true_for_all_instance_variables(:eql?, o) end def _true_for_all_instance_variables(operator, other_object) instance_variables.each { |var| return false unless instance_variable_get(var).send(operator, other_object.instance_variable_get(var)) } true end def hash instance_variables.inject(0) { |hash, var| hash.hash ^ instance_variable_get(var).hash } end end