Sha256: 2c81d71f0494d80acab2a06de778fa92e7c6c5b0abdb4f54f3949d7b503a5b1d

Contents?: true

Size: 1.46 KB

Versions: 2

Compression:

Stored size: 1.46 KB

Contents

require 'set_builder/modifier'


module SetBuilder
  class Constraint
    
    
    #
    # Sample constraints:
    # 
    #     [:awesome],
    #     [:attended, "school"],
    #     [:died],
    #     [:name, {:is => "Jerome"}]]
    # 
    def initialize(trait, *args, &block)
      @trait, @block = trait, block
      @direct_object = args.shift if trait.requires_direct_object?
      @modifiers = trait.modifiers.collect {|modifier_type| modifier_type.new(args.shift)}
    end
    
    
    
    attr_reader :trait, :direct_object, :modifiers, :negative
    
    
    
    delegate :direct_object_required?,
             :direct_object_type,
             :to => :trait
    
    
    
    def valid?
      (!direct_object_required? or !direct_object.nil?) and modifiers.all?(&:valid?)
    end
    
    
    
    def to_s
      # p "ValueMap.to_s(#{direct_object_type} (#{direct_object_type.class}), #{direct_object} (#{direct_object.class}))"
      @description ||= begin
        description = trait.to_s(@negative)
        description << " #{ValueMap.to_s(direct_object_type, direct_object)}" if direct_object_required?
        description << " #{modifiers.collect{|m| m.to_s(@negative)}.join(" ")}" unless modifiers.empty?
        description
      end
    end
    
    
    
    def negate(value)
      @negative = value
      @negative = false if trait.noun?
      self
    end
    
    
    
    def perform(scope)
      scope.scoped(@block.call(self, scope))
    end
    
    
    
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
set_builder-1.1.0 lib/set_builder/constraint.rb
set_builder-1.0.2 lib/set_builder/constraint.rb