Class: Class

Inherits:
Object
  • Object
show all
Defined in:
lib/enumerated_state.rb

Defined Under Namespace

Modules: EnumeratedStateClassMethods

Instance Method Summary collapse

Instance Method Details

#acts_as_enumerated_state(enum_attr, opts = {}) ⇒ Object Also known as: enumerated_state_pattern



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
# File 'lib/enumerated_state.rb', line 15

def acts_as_enumerated_state(enum_attr, opts={})
  enum_attr = enum_attr.to_sym
  unless (self.respond_to?(:has_enumerated_attribute?) && self.has_enumerated_attribute?(enum_attr))
    raise ArgumentError, "enumerated attribute :#{enum_attr} not defined"
  end

  self.extend EnumeratedStateClassMethods
  self.set_enumerated_state_property(enum_attr, :module_prefix, opts[:module] ? "#{opts[:module]}::" : '')

  if self.method_defined?("write_enumerated_attribute_without_#{enum_attr}")
    raise EnumeratedState::RedefinitionError, "Enumerated state already defined for :#{enum_attr}"
  end

  define_chained_method(:write_enumerated_attribute, enum_attr) do |attribute, value|
    module_prefix = self.class.get_enumerated_state_property(attribute, :module_prefix) || ''
    if (value != (old_value = self.read_enumerated_attribute(attribute)))
      unless old_value.nil?
        _module = self.class.class_eval(module_prefix + old_value.to_s.split(/_/).map(&:capitalize).join)
        self.unmix _module
      end
    end
    self.__send__("write_enumerated_attribute_without_#{enum_attr}".to_sym, attribute, value)
    if (enum_attr == attribute.to_sym && !value.nil?)
      _module = self.class.class_eval(module_prefix + value.to_s.split(/_/).map(&:capitalize).join)
      self.mixin _module
    end
  end
end