Define equality, equivalence and inspection methods
Gem version
Initialize an Equalizer with the given keys
Will use the keys with which it is initialized to define cmp?, hash, and inspect
@param [Array<Symbol>] keys
@return [undefined]
@api private
# File lib/equalizer.rb, line 15 def initialize(*keys) @keys = keys define_methods include_comparison_methods freeze end
Define an cmp? method based on the instance's values identified by keys
@return [undefined]
@api private
# File lib/equalizer.rb, line 40 def define_cmp_method keys = @keys define_method(:cmp?) do |comparator, other| keys.all? { |key| send(key).send(comparator, other.send(key)) } end private :cmp? end
Define a hash method based on the instance's values identified by keys
@return [undefined]
@api private
# File lib/equalizer.rb, line 53 def define_hash_method keys = @keys define_method(:hash) do || keys.map { |key| send(key).hash }.reduce(self.class.hash, :^) end end
Define an inspect method that reports the values of the instance's keys
@return [undefined]
@api private
# File lib/equalizer.rb, line 65 def define_inspect_method keys = @keys define_method(:inspect) do || klass = self.class name = klass.name || klass.inspect "#<#{name}#{keys.map { |key| " #{key}=#{send(key).inspect}" }.join}>" end end
Define the equalizer methods based on keys
@return [undefined]
@api private
# File lib/equalizer.rb, line 29 def define_methods define_cmp_method define_hash_method define_inspect_method end
Include the eql? and #== methods
@return [undefined]
@api private
# File lib/equalizer.rb, line 79 def include_comparison_methods module_eval { include Methods } end