Sha256: 888e1d5c0d19e032e6a01449480a6904f953e6bb3dc0300997b1cdea3bd2c30c

Contents?: true

Size: 1.23 KB

Versions: 15

Compression:

Stored size: 1.23 KB

Contents

module Ardm
  module Equalizer
    def equalize(*methods)
      define_eql_method(methods)
      define_equivalent_method(methods)
      define_hash_method(methods)
    end

    private

    def define_eql_method(methods)
      class_eval <<-RUBY, __FILE__, __LINE__ + 1
        def eql?(other)
          return true if equal?(other)
          instance_of?(other.class) &&
          #{methods.map { |method| "#{method}.eql?(other.#{method})" }.join(' && ')}
        end
      RUBY
    end

    def define_equivalent_method(methods)
      respond_to = []
      equivalent = []

      methods.each do |method|
        respond_to << "other.respond_to?(#{method.inspect})"
        equivalent << "#{method} == other.#{method}"
      end

      class_eval <<-RUBY, __FILE__, __LINE__ + 1
        def ==(other)
          return true if equal?(other)
          return false unless kind_of?(other.class) || other.kind_of?(self.class)
          #{respond_to.join(' && ')} &&
          #{equivalent.join(' && ')}
        end
      RUBY
    end

    def define_hash_method(methods)
      class_eval <<-RUBY, __FILE__, __LINE__ + 1
        def hash
          self.class.hash ^ #{methods.map { |method| "#{method}.hash" }.join(' ^ ')}
        end
      RUBY
    end
  end
end

Version data entries

15 entries across 15 versions & 1 rubygems

Version Path
ardm-0.4.0.ar427 lib/ardm/support/equalizer.rb
ardm-0.4.0 lib/ardm/support/equalizer.rb
ardm-0.3.2 lib/ardm/support/equalizer.rb
ardm-0.3.1 lib/ardm/support/equalizer.rb
ardm-0.3.0 lib/ardm/support/equalizer.rb
ardm-0.2.7 lib/ardm/support/equalizer.rb
ardm-0.2.6 lib/ardm/support/equalizer.rb
ardm-0.2.5 lib/ardm/support/equalizer.rb
ardm-0.2.4 lib/ardm/support/equalizer.rb
ardm-0.2.3 lib/ardm/support/equalizer.rb
ardm-0.2.2 lib/ardm/support/equalizer.rb
ardm-0.2.1 lib/ardm/support/equalizer.rb
ardm-0.2.0 lib/ardm/support/equalizer.rb
ardm-0.1.0 lib/ardm/support/equalizer.rb
ardm-0.0.1 lib/ardm/support/equalizer.rb