class Raft4r::FSM

Public Class Methods

new(&block) click to toggle source
# File lib/raft4r/fsm.rb, line 27
def initialize &block
        self.instance_eval(&block) if block_given?
end

Public Instance Methods

current_state() click to toggle source
# File lib/raft4r/fsm.rb, line 82
def current_state
        @fsm_current
end
dump() click to toggle source
# File lib/raft4r/fsm.rb, line 78
def dump
        p self
end
goto(s) click to toggle source
# File lib/raft4r/fsm.rb, line 65
def goto s
        return if s == @current
        self.instance_eval(&current.onleave) if current.onleave
        set_current s
        self.instance_eval(&current.onenter) if current.onenter
end
init(st) click to toggle source
# File lib/raft4r/fsm.rb, line 43
def init st
        @fsm_states = {}
        @fsm_current = nil
        @fsm_init = st
end
on(s, *arguments) click to toggle source
# File lib/raft4r/fsm.rb, line 56
def on s, *arguments
        curr = @fsm_states[@fsm_current]
        if curr.triggers[s]
                self.instance_exec(*arguments, &curr.triggers[s])
        else
                STDERR.puts "State: #{@fsm_current}, trigger #{s} not exists"
        end
end
reset() click to toggle source
# File lib/raft4r/fsm.rb, line 72
def reset
        raise 'No init state' unless @fsm_init
        set_current @fsm_init
        self.instance_eval(&current.onenter) if current.onenter
end
state(s, &block) click to toggle source
# File lib/raft4r/fsm.rb, line 49
def state s, &block
        raise 'State already exists' if @fsm_states[s]
        ss = StateScope.new s
        ss.instance_eval(&block)
        @fsm_states[s] = ss
end

Private Instance Methods

current() click to toggle source
# File lib/raft4r/fsm.rb, line 31
def current
        curr = @fsm_states[@fsm_current]
        raise "Invalid state #{s}" unless curr
        curr
end
set_current(s) click to toggle source
# File lib/raft4r/fsm.rb, line 37
def set_current s
        raise "Invalid new state #{s}" unless @fsm_states[s]
        @fsm_current = s
end