module BitwiseAttribute::ClassMethods

Public Instance Methods

attr_bitwise(name, values:, column_name: nil) click to toggle source
# File lib/bitwise_attribute.rb, line 19
def attr_bitwise(name, values:, column_name: nil)
  column_name ||= "#{name.to_s.singularize}_mask"

  mapping = build_mapping(values)

  define_class_methods(name, column_name, mapping)
  define_instance_methods(name, column_name, mapping)
end

Private Instance Methods

build_mapping(values) click to toggle source

Builds internal bitwise key-value mapping it add a zero value, needed for bits operations. Each sym get a power of 2 value

# File lib/bitwise_attribute.rb, line 60
def build_mapping(values)
  {}.tap do |hash|
    values.each_with_index { |key, index| hash[key] = (0b1 << index) }
  end
end
define_class_methods(name, column_name, mapping) click to toggle source
# File lib/bitwise_attribute.rb, line 30
def define_class_methods(name, column_name, mapping)
  define_singleton_method(name) do
    mapping
  end

  define_named_scopes(name, column_name, mapping) if defined?(ActiveRecord)
end
define_instance_methods(name, column_name, mapping) click to toggle source
# File lib/bitwise_attribute.rb, line 38
def define_instance_methods(name, column_name, mapping)
  define_method(name) do
    roles = value_getter(column_name, mapping)

    # This special array will call self.<name>= after changed
    ValuesList.new(name, self, roles)
  end

  define_method("#{name}=") do |new_values|
    value_setter(column_name, Array(new_values), mapping)
  end

  # Adds a boolean method for each key (ex: admin?)
  mapping.each_key do |key|
    define_method("#{key}?") do
      value?(column_name, mapping[key])
    end
  end
end