module Risky::Resolver::ClassMethods

Makes it easy to resolve conflicts in an object in different ways.

class User

include Risky::Resolver
value :union, :resolve => :union
value :union, :resolve => lambda do |xs| xs.first end

Public Instance Methods

merge(versions) click to toggle source
Calls superclass method
# File lib/risky/resolver.rb, line 10
def merge(versions)
  p = super(versions).clone
 
  # For each field, use the given resolver to merge all the conflicting
  # values together.
  values.each do |value, opts|
    next unless resolver = opts[:resolve]

    # Convert symbols and such to callables.
    unless resolver.respond_to? :call
      resolver = begin
        # Try our resolvers
        Resolvers.method resolver
      rescue
        # Try a class method
        method resolver
      end
    end

    # Resolve and set
    p.send("#{value}=", resolver.call(
      versions.map do |version|
        version.send value
      end
    ))
  end

  p
end