11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
# File 'lib/has_bitfield.rb', line 11
def has_bitfield(name, flags_hash)
@has_bitfield ||= {}
values = {}
bits = {}
defaults = {}
bit_names = {}
field = flags_hash.delete(:as) || "#{name}_flags".to_sym
@has_bitfield[name] = {
:as => field,
:values => values,
:bit_names => bit_names,
:defaults => defaults
}
default_mask = 0
flags_hash.each do |key, flag|
flag_name, options = hash_for_flag(flag)
raise ArgumentError, "has_bitfield: keys should be positive integers less than or equal to 32.
'#{key}' is invalid as a key for '#{flag_name}'." unless is_valid_bit?(key)
value = 2**(key - 1)
values[flag] = value
bit_names[key] = flag
default = options.has_key?(:default) ? options[:default] : false;
defaults[key] = default
default_mask = default_mask | value if default
methods_for_flag(flag_name, value, field)
end
method_for_name(name, field)
method_for_initialize(name, default_mask, field)
end
|