Sha256: 3985056eb84977ad5897c0a780508438773e0097f916397fe87af753989d2729

Contents?: true

Size: 1.08 KB

Versions: 4

Compression:

Stored size: 1.08 KB

Contents

# encoding: UTF-8
module Maintain
  class BitmaskValue < Value
    def initialize(state, value = nil)
      @state = state
      @value = value
    end

    def set_value(value)
      @value = bitmask_for(value)
    end

    protected
    def bitmask_for(states)
      Array(states).map{|value| value_for(value) }.sort.inject(0) {|total, mask| total | mask }
    end

    def compare_value
      @value ||= 0
    end

    def compare_value_for(state)
      bitmask_for(state)
    end

    def method_missing(method, *args)
      if (method.to_s =~ /^(.+)(\?|!)$/) && @state.states.has_key?($1.to_sym)
        compare = value_for($1)
        if $2 == '?'
          self.class.class_eval <<-EOC
            def #{method}
              @value & #{compare.inspect} != 0
            end
          EOC
          @value & compare != 0
        else
          self.class.class_eval <<-EOC
            def #{method}
              @value = (@value || 0) | #{compare.inspect}
            end
          EOC
          @value = (@value || 0) | compare
        end
      else
        super
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
maintain-0.2.2 lib/maintain/bitmask_value.rb
maintain-0.2.1 lib/maintain/bitmask_value.rb
maintain-0.1.9 lib/maintain/bitmask_value.rb
maintain-0.1.8 lib/maintain/bitmask_value.rb