Module: Stateful::ActiveRecord::ClassMethods
- Defined in:
- lib/Stateful/ActiveRecord/ClassMethods.rb
Class Method Summary collapse
Instance Method Summary collapse
- #column_name_for_machine(machine_name = nil) ⇒ Object
- #define_event_method(transition, machine_name: nil) ⇒ Object
- #define_final_stateQ_method(machine_name: nil) ⇒ Object
- #define_initial_stateQ_method(machine_name: nil) ⇒ Object
-
#define_named_machine_methods(machine_name) ⇒ Object
class << self.
- #define_next_state_method(machine_name: nil) ⇒ Object
- #define_stateful_column_name_getter_method(machine_name: nil) ⇒ Object
- #define_stateful_column_name_setter_method(machine_name: nil) ⇒ Object
- #define_status_predicate_method(state_name, machine_name: nil) ⇒ Object
- #define_transitions_method(machine_name: nil) ⇒ Object
- #stateful_column_name ⇒ Object
- #stateful_column_name=(stateful_column_name) ⇒ Object
Class Method Details
.extended(klass) ⇒ Object
8 9 10 11 12 13 14 15 |
# File 'lib/Stateful/ActiveRecord/ClassMethods.rb', line 8 def extended(klass) klass.define_stateful_column_name_setter_method klass.define_stateful_column_name_getter_method klass.define_next_state_method klass.define_transitions_method klass.define_initial_stateQ_method klass.define_final_stateQ_method end |
Instance Method Details
#column_name_for_machine(machine_name = nil) ⇒ Object
35 36 37 38 39 40 41 |
# File 'lib/Stateful/ActiveRecord/ClassMethods.rb', line 35 def column_name_for_machine(machine_name = nil) if machine_name "#{machine_name}_state" else instance_variable_get(:@stateful_column_name) end end |
#define_event_method(transition, machine_name: nil) ⇒ Object
43 44 45 46 47 48 49 50 |
# File 'lib/Stateful/ActiveRecord/ClassMethods.rb', line 43 def define_event_method(transition, machine_name: nil) stateful_column_name = column_name_for_machine(machine_name) define_method(transition.event_name) do next_state_name = self.send(stateful_column_name).next_state_name(transition.event_name) next_state = self.class.stateful_state_machine(machine_name).find(next_state_name) self.send("#{stateful_column_name}=", next_state) end end |
#define_final_stateQ_method(machine_name: nil) ⇒ Object
108 109 110 111 112 113 114 |
# File 'lib/Stateful/ActiveRecord/ClassMethods.rb', line 108 def define_final_stateQ_method(machine_name: nil) stateful_column_name = column_name_for_machine(machine_name) method_name = machine_name ? "#{machine_name}_final_state?" : :final_state? define_method(method_name) do self.class.stateful_state_machine(machine_name).final_states.include?(self.send(stateful_column_name)) end end |
#define_initial_stateQ_method(machine_name: nil) ⇒ Object
100 101 102 103 104 105 106 |
# File 'lib/Stateful/ActiveRecord/ClassMethods.rb', line 100 def define_initial_stateQ_method(machine_name: nil) stateful_column_name = column_name_for_machine(machine_name) method_name = machine_name ? "#{machine_name}_initial_state?" : :initial_state? define_method(method_name) do self.send(stateful_column_name) == self.class.stateful_state_machine(machine_name).initial_state end end |
#define_named_machine_methods(machine_name) ⇒ Object
class << self
18 19 20 21 22 23 24 25 |
# File 'lib/Stateful/ActiveRecord/ClassMethods.rb', line 18 def define_named_machine_methods(machine_name) define_stateful_column_name_setter_method(machine_name: machine_name) define_stateful_column_name_getter_method(machine_name: machine_name) define_next_state_method(machine_name: machine_name) define_transitions_method(machine_name: machine_name) define_initial_stateQ_method(machine_name: machine_name) define_final_stateQ_method(machine_name: machine_name) end |
#define_next_state_method(machine_name: nil) ⇒ Object
83 84 85 86 87 88 89 90 |
# File 'lib/Stateful/ActiveRecord/ClassMethods.rb', line 83 def define_next_state_method(machine_name: nil) stateful_column_name = column_name_for_machine(machine_name) method_name = machine_name ? "#{machine_name}_next_state" : :next_state define_method(method_name) do |event_name| next_state_name = self.send(stateful_column_name).next_state_name(event_name) self.class.stateful_state_machine(machine_name).find(next_state_name) end end |
#define_stateful_column_name_getter_method(machine_name: nil) ⇒ Object
69 70 71 72 73 74 75 76 77 78 79 80 81 |
# File 'lib/Stateful/ActiveRecord/ClassMethods.rb', line 69 def define_stateful_column_name_getter_method(machine_name: nil) stateful_column_name = column_name_for_machine(machine_name) define_method(stateful_column_name) do instance_variable_set("@#{stateful_column_name}", self.class.stateful_state_machine(machine_name).find(read_attribute(stateful_column_name))) if state = instance_variable_get("@#{stateful_column_name}") state else initial_state = self.class.stateful_state_machine(machine_name).initial_state self.send("#{stateful_column_name}=", initial_state.name) initial_state end end end |
#define_stateful_column_name_setter_method(machine_name: nil) ⇒ Object
59 60 61 62 63 64 65 66 67 |
# File 'lib/Stateful/ActiveRecord/ClassMethods.rb', line 59 def define_stateful_column_name_setter_method(machine_name: nil) stateful_column_name = column_name_for_machine(machine_name) define_method("#{stateful_column_name}=") do |state| instance_variable_set("@#{stateful_column_name}", self.class.stateful_state_machine(machine_name).find(state)) write_attribute(stateful_column_name, instance_variable_get("@#{stateful_column_name}").name) self.save instance_variable_get("@#{stateful_column_name}") end end |
#define_status_predicate_method(state_name, machine_name: nil) ⇒ Object
52 53 54 55 56 57 |
# File 'lib/Stateful/ActiveRecord/ClassMethods.rb', line 52 def define_status_predicate_method(state_name, machine_name: nil) stateful_column_name = column_name_for_machine(machine_name) define_method("#{state_name}?") do self.send(stateful_column_name).name == state_name end end |
#define_transitions_method(machine_name: nil) ⇒ Object
92 93 94 95 96 97 98 |
# File 'lib/Stateful/ActiveRecord/ClassMethods.rb', line 92 def define_transitions_method(machine_name: nil) stateful_column_name = column_name_for_machine(machine_name) method_name = machine_name ? "#{machine_name}_transitions" : :transitions define_method(method_name) do self.send(stateful_column_name).transitions end end |
#stateful_column_name ⇒ Object
31 32 33 |
# File 'lib/Stateful/ActiveRecord/ClassMethods.rb', line 31 def stateful_column_name @stateful_column_name end |
#stateful_column_name=(stateful_column_name) ⇒ Object
27 28 29 |
# File 'lib/Stateful/ActiveRecord/ClassMethods.rb', line 27 def stateful_column_name=(stateful_column_name) @stateful_column_name = stateful_column_name end |