class Virtus::Equalizer
Define equality, equivalence and inspection methods
Public Class Methods
Initialize an Equalizer with the given keys
Will use the keys with which it is initialized to define cmp?, hash, and inspect
@param [String] name
@param [Array<Symbol>] keys
@return [undefined]
@api private
# File lib/virtus/support/equalizer.rb, line 18 def initialize(name, keys = []) @name = name.dup.freeze @keys = keys.dup define_methods include_comparison_methods end
Public Instance Methods
Append a key and compile the equality methods
@return [Equalizer] self
@api private
# File lib/virtus/support/equalizer.rb, line 30 def <<(key) @keys << key self end
Private Instance Methods
Define an cmp? method based on the instance's values identified by keys
@return [undefined]
@api private
# File lib/virtus/support/equalizer.rb, line 53 def define_cmp_method keys = @keys define_method(:cmp?) do |comparator, other| keys.all? { |key| send(key).send(comparator, other.send(key)) } end end
Define a hash method based on the instance's values identified by keys
@return [undefined]
@api private
# File lib/virtus/support/equalizer.rb, line 65 def define_hash_method keys = @keys define_method(:hash) do keys.map { |key| send(key) }.push(self.class).hash end end
Define an inspect method that reports the values of the instance's keys
@return [undefined]
@api private
# File lib/virtus/support/equalizer.rb, line 77 def define_inspect_method name, keys = @name, @keys define_method(:inspect) do "#<#{name}#{keys.map { |key| " #{key}=#{send(key).inspect}" }.join}>" end end
Define the equalizer methods based on keys
@return [undefined]
@api private
# File lib/virtus/support/equalizer.rb, line 42 def define_methods define_cmp_method define_hash_method define_inspect_method end
Include the eql? and #== methods
@return [undefined]
@api private
# File lib/virtus/support/equalizer.rb, line 89 def include_comparison_methods module_eval { include Methods } end