module SimpleEnum::Attribute
SimpleEnum::Attribute
is the base class to be included in objects to get the as_enum
functionality. All the including class needs to provide is a setter and getter for `source`, by default the `source` is `<enum>_cd`. This is similar to how relations work in Rails, the idea is not taint the original method.
Constants
- EXTENSIONS
Registered registrator methods from extensions
Public Instance Methods
as_enum(name, values, options = {})
click to toggle source
# File lib/simple_enum/attribute.rb, line 19 def as_enum(name, values, options = {}) options.assert_valid_keys(:source, :prefix, :with, :accessor, :map, :pluralize_scopes) hash = SimpleEnum::Hasher.map(values, options) enum = SimpleEnum::Enum.new(name, hash) accessor = SimpleEnum::Accessors.accessor(name, enum, options) generate_enum_class_accessors_for(enum, accessor) generate_enum_instance_accessors_for(enum, accessor) generate_additional_enum_methods_for(enum, accessor, options) EXTENSIONS.uniq.each do |extension| send "generate_enum_#{extension}_extension_for", enum, accessor end enum end
Private Instance Methods
generate_additional_enum_methods_for(enum, accessor, options)
click to toggle source
# File lib/simple_enum/attribute.rb, line 57 def generate_additional_enum_methods_for(enum, accessor, options) with_options = Array.wrap(options.fetch(:with, SimpleEnum.with)) scope_option, feature_options = with_options.partition { |option| option == :scope } feature_options.each do |feature| send "generate_enum_#{feature}_methods_for", enum, accessor end unless scope_option.empty? pluralize_scopes = options.fetch(:pluralize_scopes, SimpleEnum.pluralize_scopes) generate_enum_scope_methods_for(enum, accessor, pluralize_scopes) end end
generate_enum_attribute_methods_for(enum, accessor)
click to toggle source
# File lib/simple_enum/attribute.rb, line 78 def generate_enum_attribute_methods_for(enum, accessor) simple_enum_module.module_eval do enum.each_pair do |key, value| define_method("#{accessor.prefix}#{key}?") { accessor.selected?(self, key) } define_method("#{accessor.prefix}#{key}!") { accessor.write(self, key) } end end end
generate_enum_class_accessors_for(enum, accessor)
click to toggle source
# File lib/simple_enum/attribute.rb, line 43 def generate_enum_class_accessors_for(enum, accessor) name = accessor.name.pluralize singleton_class.send(:define_method, name) { enum } singleton_class.send(:define_method, "#{name}_accessor") { accessor } end
generate_enum_dirty_methods_for(enum, accessor)
click to toggle source
# File lib/simple_enum/attribute.rb, line 71 def generate_enum_dirty_methods_for(enum, accessor) simple_enum_module.module_eval do define_method("#{accessor}_changed?") { accessor.changed?(self) } define_method("#{accessor}_was") { accessor.was(self) } end end
generate_enum_instance_accessors_for(enum, accessor)
click to toggle source
# File lib/simple_enum/attribute.rb, line 49 def generate_enum_instance_accessors_for(enum, accessor) simple_enum_module.module_eval do define_method("#{accessor}") { accessor.read(self) } define_method("#{accessor}=") { |value| accessor.write(self, value) } define_method("#{accessor}?") { |value = nil| accessor.selected?(self, value) } end end
generate_enum_scope_methods_for(enum, accessor, pluralize_scopes)
click to toggle source
# File lib/simple_enum/attribute.rb, line 87 def generate_enum_scope_methods_for(enum, accessor, pluralize_scopes) return unless respond_to?(:scope) enum.each_pair do |key, value| scope_key = pluralize_scopes ? key.pluralize : key scope "#{accessor.prefix}#{scope_key}", -> { accessor.scope(self, value) } end end
simple_enum_module()
click to toggle source
# File lib/simple_enum/attribute.rb, line 39 def simple_enum_module @simple_enum_module ||= Module.new.tap { |mod| include mod } end