class Virtus::Equalizer

Define equality, equivalence and inspection methods

Public Class Methods

new(name, keys = []) click to toggle source

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

<<(key) click to toggle source

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_cmp_method() click to toggle source

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_hash_method() click to toggle source

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_inspect_method() click to toggle source

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_methods() click to toggle source

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_comparison_methods() click to toggle source

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