Class: Stateful::StateMachine

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

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(klass, machine_name: nil, options: {}) ⇒ StateMachine

Returns a new instance of StateMachine.



15
16
17
18
19
20
21
22
# File 'lib/Stateful/StateMachine.rb', line 15

def initialize(klass, machine_name: nil, options: {})
  @klass = klass
  @machine_name = machine_name
  @options = options
  @all = []
  @initial_state = nil
  @final_states = []
end

Instance Attribute Details

#allObject (readonly)

Returns the value of attribute all.



10
11
12
# File 'lib/Stateful/StateMachine.rb', line 10

def all
  @all
end

#machine_nameObject (readonly)

Returns the value of attribute machine_name.



10
11
12
# File 'lib/Stateful/StateMachine.rb', line 10

def machine_name
  @machine_name
end

#optionsObject

Returns the value of attribute options.



9
10
11
# File 'lib/Stateful/StateMachine.rb', line 9

def options
  @options
end

Instance Method Details

#detect(candidate_state) ⇒ Object Also known as: find



24
25
26
27
28
29
30
31
32
33
# File 'lib/Stateful/StateMachine.rb', line 24

def detect(candidate_state)
  candidate_state_name = (
    if candidate_state.is_a?(State)
      candidate_state.name
    else
      candidate_state && candidate_state.to_sym
    end
  )
  self.all.detect{|state| state.name == candidate_state_name}
end

#final_state(*state_names) ⇒ Object Also known as: final_state=



61
62
63
# File 'lib/Stateful/StateMachine.rb', line 61

def final_state(*state_names)
  final_states(*state_names).first
end

#final_states(*state_names) ⇒ Object



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

def final_states(*state_names)
  state_names = state_names.flatten
  if !state_names.empty?
    state_names.each do |state_name|
      final_state = State.new(state_name)
      @final_states << final_state
      all << final_state
      @klass.define_status_predicate_method(state_name, machine_name: @machine_name)
    end
    @final_states
  else
    @final_states
  end
end

#find_or_create(state_name, options = {}) ⇒ Object



45
46
47
48
49
50
51
# File 'lib/Stateful/StateMachine.rb', line 45

def find_or_create(state_name, options = {})
  find(state_name) || (
    state = State.new(state_name, options)
    all << state
    state
  )
end

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



53
54
55
56
57
58
59
# File 'lib/Stateful/StateMachine.rb', line 53

def initial_state(state_name = nil, options = {}, &block)
  if state_name
    @initial_state = state(state_name, options, &block)
  else
    @initial_state
  end
end

#missing?(state) ⇒ Boolean Also known as: new_state?

Returns:

  • (Boolean)


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

def missing?(state)
  !detect(state)
end

#present?(state) ⇒ Boolean

Returns:

  • (Boolean)


41
42
43
# File 'lib/Stateful/StateMachine.rb', line 41

def present?(state)
  !!detect(state)
end

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



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

def state(state_name, options = {}, &block)
  options.merge!(non_deterministic_event_ordering: global_non_deterministic_event_ordering?)
  state = find_or_create(state_name, options)
  state.instance_eval(&block) if block
  state.transitions.each do |transition|
    @klass.define_event_method(transition, machine_name: @machine_name)
  end
  @klass.define_status_predicate_method(state_name, machine_name: @machine_name)
  state
end