module BitAttrs::ClassMethods

Attributes

bit_attrs[R]

Public Instance Methods

bitset(flags_map) click to toggle source

bitset roles: [:admin, :user, :guest] bitset access_levels: [read: 0, write: 1, delete: 2, api: 3]

# File lib/bit_attrs.rb, line 18
def bitset(flags_map)
  @bit_attrs ||= {}

  flags_map.each do |attr_name, flags_list|
    @bit_attrs[attr_name] = check_flags_list(flags_list)
    define_alias_methods(attr_name, @bit_attrs[attr_name])
    Bindings.create(self, attr_name)
  end
end

Private Instance Methods

check_flags_list(flags_list) click to toggle source
# File lib/bit_attrs.rb, line 30
def check_flags_list(flags_list)
  return flags_list if flags_list.is_a?(Hash)

  flags_list.each_with_index.inject({}) do |memo, (flag, i)|
    memo.merge!(flag => i)
  end
end
define_alias_methods(attr_name, flags_map) click to toggle source
# File lib/bit_attrs.rb, line 38
def define_alias_methods(attr_name, flags_map)
  define_method attr_name do
    Bitset.new(flags_map, self.send("#{attr_name}_mask"))
  end

  define_method "#{attr_name}=" do |flags_map|
    bitset = self.class.new.send(attr_name)
    flags_map.each { |flag, bool| bitset[flag] = bool }
    self.send("#{attr_name}_mask=", bitset.to_i)
  end

  flags_map.each do |flag, _i|
    define_method(flag) { self.send(attr_name)[flag] }
    define_method("#{flag}?") { self.send(flag) }

    define_method("#{flag}=") do |bool|
      bitset = self.send(attr_name)
      bitset[flag] = bool
      self.send("#{attr_name}_mask=", bitset.to_i)
    end
  end
end