Module: BitSettings::ClassMethods

Defined in:
lib/bit_settings.rb

Instance Method Summary collapse

Instance Method Details

#add_settings(*settings, column: :settings, prefix: nil) ⇒ Object



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/bit_settings.rb', line 28

def add_settings(*settings, column: :settings, prefix: nil)
  prefix = prefix ? "#{prefix}_" : ''
  if settings.size > 32
    raise 'You can NOT have more than 32 settings (max unsigned int with 4 bytes is 2^32-1)'
  else

    self.bit_settings ||= {}
    self.bit_settings[column] = settings.map{|x| "#{prefix}#{x}".to_sym}

    cast_to_boolean = BooleanValue.cast_to_boolean_func

    settings.each_with_index do |setting, i|
      define_method "#{prefix}#{setting}" do
        self.send(column) & (1 << i) > 0
      end
      alias_method "#{prefix}#{setting}?", "#{prefix}#{setting}"
      
      define_method "#{prefix}#{setting}=" do |value|
        if cast_to_boolean.call(value)
          self.send("#{column}=", self.send(column) | (1 << i))
        else
          self.send("#{column}=", self.send(column) & ~(1 << i))
        end
      end
    end

  end
end