Class: Class
- Inherits:
-
Object
- Object
- Class
- Defined in:
- lib/enumerated_state.rb
Defined Under Namespace
Modules: EnumeratedStateClassMethods
Instance Method Summary collapse
- #acts_as_enumerated_state(enum_attr, opts = {}) ⇒ Object (also: #enumerated_state_pattern)
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 |