Sha256: 33751ae526e5556b49f4c6bc99821d248adf1ecf8d467d2626efbf381c6e1bfa

Contents?: true

Size: 1.22 KB

Versions: 8

Compression:

Stored size: 1.22 KB

Contents

module DataMapper
  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
          #{methods.map { |method| "#{method}.hash" }.join(' ^ ')}
        end
      RUBY
    end
  end
end

Version data entries

8 entries across 8 versions & 1 rubygems

Version Path
dm-core-1.1.0.rc2 lib/dm-core/support/equalizer.rb
dm-core-1.1.0.rc1 lib/dm-core/support/equalizer.rb
dm-core-1.0.2 lib/dm-core/support/equalizer.rb
dm-core-1.0.1 lib/dm-core/support/equalizer.rb
dm-core-1.0.0 lib/dm-core/support/equalizer.rb
dm-core-1.0.0.rc3 lib/dm-core/support/equalizer.rb
dm-core-1.0.0.rc2 lib/dm-core/support/equalizer.rb
dm-core-1.0.0.rc1 lib/dm-core/support/equalizer.rb