Module: Stateful::ClassMethods

Defined in:
lib/Stateful/ClassMethods.rb

Instance Method Summary collapse

Instance Method Details

#define_event_method(transition, machine_name: nil) ⇒ Object



65
66
67
68
69
70
71
72
# File 'lib/Stateful/ClassMethods.rb', line 65

def define_event_method(transition, machine_name: nil)
  attribute_name = stateful_attribute_name_for_machine(machine_name)
  define_method(transition.event_name) do
    next_state_name = self.send(attribute_name).next_state_name(transition.event_name)
    next_state = self.class.stateful_state_machine(machine_name).find(next_state_name)
    self.send("#{attribute_name}=", next_state)
  end
end

#define_final_stateQ_method(machine_name: nil) ⇒ Object



106
107
108
109
110
111
112
# File 'lib/Stateful/ClassMethods.rb', line 106

def define_final_stateQ_method(machine_name: nil)
  attribute_name = stateful_attribute_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(attribute_name))
  end
end

#define_initial_stateQ_method(machine_name: nil) ⇒ Object



98
99
100
101
102
103
104
# File 'lib/Stateful/ClassMethods.rb', line 98

def define_initial_stateQ_method(machine_name: nil)
  attribute_name = stateful_attribute_name_for_machine(machine_name)
  method_name = machine_name ? "#{machine_name}_initial_state?" : :initial_state?
  define_method(method_name) do
    self.send(attribute_name) == self.class.stateful_state_machine(machine_name).initial_state
  end
end

#define_named_machine_methods(machine_name) ⇒ Object

adapter methods



56
57
58
59
60
61
62
63
# File 'lib/Stateful/ClassMethods.rb', line 56

def define_named_machine_methods(machine_name)
  define_stateful_attribute_setter_method(machine_name: machine_name)
  define_stateful_attribute_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



81
82
83
84
85
86
87
88
# File 'lib/Stateful/ClassMethods.rb', line 81

def define_next_state_method(machine_name: nil)
  attribute_name = stateful_attribute_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(attribute_name).next_state_name(event_name)
    self.class.stateful_state_machine(machine_name).find(next_state_name)
  end
end

#define_status_predicate_method(state_name, machine_name: nil) ⇒ Object



74
75
76
77
78
79
# File 'lib/Stateful/ClassMethods.rb', line 74

def define_status_predicate_method(state_name, machine_name: nil)
  attribute_name = stateful_attribute_name_for_machine(machine_name)
  define_method("#{state_name}?") do
    self.send(attribute_name).name == state_name
  end
end

#define_transitions_method(machine_name: nil) ⇒ Object



90
91
92
93
94
95
96
# File 'lib/Stateful/ClassMethods.rb', line 90

def define_transitions_method(machine_name: nil)
  attribute_name = stateful_attribute_name_for_machine(machine_name)
  method_name = machine_name ? "#{machine_name}_transitions" : :transitions
  define_method(method_name) do
    self.send(attribute_name).transitions
  end
end

#final_state(*state_names) ⇒ Object



44
45
46
# File 'lib/Stateful/ClassMethods.rb', line 44

def final_state(*state_names)
  stateful_state_machine.final_state(*state_names)
end

#final_state?Boolean Also known as: has_final_state?

predicate methods

Returns:

  • (Boolean)


116
117
118
119
120
121
122
# File 'lib/Stateful/ClassMethods.rb', line 116

def final_state?
  if state_machines.empty?
    !final_states.empty?
  else
    state_machines.all?{|_name, states| !states.final_states.empty?}
  end
end

#final_states(*state_names) ⇒ Object



48
49
50
# File 'lib/Stateful/ClassMethods.rb', line 48

def final_states(*state_names)
  stateful_state_machine.final_states(*state_names)
end

#initial_state(state_name = nil, options = {}, &block) ⇒ Object



36
37
38
# File 'lib/Stateful/ClassMethods.rb', line 36

def initial_state(state_name = nil, options = {}, &block)
  stateful_state_machine.initial_state(state_name, options, &block)
end

#state(state_name, options = {}, &block) ⇒ Object



40
41
42
# File 'lib/Stateful/ClassMethods.rb', line 40

def state(state_name, options = {}, &block)
  stateful_state_machine.state(state_name, options, &block)
end

#state_machine(name, options = {}, &block) ⇒ Object



27
28
29
30
31
32
33
34
# File 'lib/Stateful/ClassMethods.rb', line 27

def state_machine(name, options = {}, &block)
  unless state_machines.key?(name)
    define_named_machine_methods(name)
  end
  sm = stateful_state_machine(name)
  sm.options = options unless options.empty?
  sm.instance_eval(&block) if block
end

#state_machinesObject



8
9
10
# File 'lib/Stateful/ClassMethods.rb', line 8

def state_machines
  @state_machines ||= {}
end

#stateful(options = {}, &block) ⇒ Object

start DSL



22
23
24
25
# File 'lib/Stateful/ClassMethods.rb', line 22

def stateful(options = {}, &block)
  stateful_state_machine.options = options unless options.empty?
  class_eval(&block) if block
end

#stateful_state_machine(machine_name = nil) ⇒ Object



12
13
14
15
16
17
18
# File 'lib/Stateful/ClassMethods.rb', line 12

def stateful_state_machine(machine_name = nil)
  if machine_name
    state_machines[machine_name] ||= Stateful::StateMachine.new(self, machine_name: machine_name)
  else
    @stateful_state_machine ||= Stateful::StateMachine.new(self)
  end
end