Module: Stateful::Poro::ClassMethods

Defined in:
lib/Stateful/Poro/ClassMethods.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.extended(klass) ⇒ Object



8
9
10
11
12
13
14
15
# File 'lib/Stateful/Poro/ClassMethods.rb', line 8

def extended(klass)
  klass.define_stateful_variable_name_setter_method
  klass.define_stateful_variable_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

#define_event_method(transition, machine_name: nil) ⇒ Object



43
44
45
46
47
48
49
50
# File 'lib/Stateful/Poro/ClassMethods.rb', line 43

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

#define_final_stateQ_method(machine_name: nil) ⇒ Object



104
105
106
107
108
109
110
# File 'lib/Stateful/Poro/ClassMethods.rb', line 104

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

#define_initial_stateQ_method(machine_name: nil) ⇒ Object



96
97
98
99
100
101
102
# File 'lib/Stateful/Poro/ClassMethods.rb', line 96

def define_initial_stateQ_method(machine_name: nil)
  variable_name = variable_name_for_machine(machine_name)
  method_name = machine_name ? "#{machine_name}_initial_state?" : :initial_state?
  define_method(method_name) do
    self.send(variable_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/Poro/ClassMethods.rb', line 18

def define_named_machine_methods(machine_name)
  define_stateful_variable_name_setter_method(machine_name: machine_name)
  define_stateful_variable_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



79
80
81
82
83
84
85
86
# File 'lib/Stateful/Poro/ClassMethods.rb', line 79

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

#define_stateful_variable_name_getter_method(machine_name: nil) ⇒ Object



66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/Stateful/Poro/ClassMethods.rb', line 66

def define_stateful_variable_name_getter_method(machine_name: nil)
  variable_name = variable_name_for_machine(machine_name)
  define_method(variable_name) do
    if state = instance_variable_get("@#{variable_name}")
      state
    else
      initial_state = self.class.stateful_state_machine(machine_name).initial_state
      self.send("#{variable_name}=", initial_state.name)
      initial_state
    end
  end
end

#define_stateful_variable_name_setter_method(machine_name: nil) ⇒ Object



59
60
61
62
63
64
# File 'lib/Stateful/Poro/ClassMethods.rb', line 59

def define_stateful_variable_name_setter_method(machine_name: nil)
  variable_name = variable_name_for_machine(machine_name)
  define_method("#{variable_name}=") do |state|
    instance_variable_set("@#{variable_name}", self.class.stateful_state_machine(machine_name).find(state))
  end
end

#define_status_predicate_method(state_name, machine_name: nil) ⇒ Object



52
53
54
55
56
57
# File 'lib/Stateful/Poro/ClassMethods.rb', line 52

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

#define_transitions_method(machine_name: nil) ⇒ Object



88
89
90
91
92
93
94
# File 'lib/Stateful/Poro/ClassMethods.rb', line 88

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

#stateful_variable_nameObject



31
32
33
# File 'lib/Stateful/Poro/ClassMethods.rb', line 31

def stateful_variable_name
  @stateful_variable_name
end

#stateful_variable_name=(stateful_variable_name) ⇒ Object



27
28
29
# File 'lib/Stateful/Poro/ClassMethods.rb', line 27

def stateful_variable_name=(stateful_variable_name)
  @stateful_variable_name = stateful_variable_name
end

#variable_name_for_machine(machine_name = nil) ⇒ Object



35
36
37
38
39
40
41
# File 'lib/Stateful/Poro/ClassMethods.rb', line 35

def variable_name_for_machine(machine_name = nil)
  if machine_name
    "#{machine_name}_state"
  else
    instance_variable_get(:@stateful_variable_name)
  end
end