class AttrExtras::AttrValue

Attributes

klass[R]
names[R]

Public Class Methods

new(klass, *names) click to toggle source
# File lib/attr_extras/attr_value.rb, line 2
def initialize(klass, *names)
  @klass, @names = klass, names
end

Public Instance Methods

apply() click to toggle source
# File lib/attr_extras/attr_value.rb, line 9
def apply
  define_readers
  define_equals
  define_hash_identity
end

Private Instance Methods

define_equals() click to toggle source
# File lib/attr_extras/attr_value.rb, line 21
def define_equals
  names = @names  # Make available within block.

  klass.send(:define_method, :==) do |other|
    return false unless other.is_a?(self.class)

    names.all? { |attr| self.public_send(attr) == other.public_send(attr) }
  end
end
define_hash_identity() click to toggle source
# File lib/attr_extras/attr_value.rb, line 31
def define_hash_identity
  names = @names  # Make available within block.

  # Both #eql? and #hash are required for hash identity.

  klass.send(:alias_method, :eql?, :==)

  klass.send(:define_method, :hash) do
    [ self.class, *names.map { |attr| public_send(attr) } ].hash
  end
end
define_readers() click to toggle source
# File lib/attr_extras/attr_value.rb, line 17
def define_readers
  klass.send(:attr_reader, *names)
end