Following a frustrating week with the acts_as_state_machine/AASM plugin, I ended up writing my own finite state machine library for Ruby.
It's called Golem, and it's now on Github, here: http://github.com/zuk/golem_statemachine/tree/master
The code is cleaner than AASM's (or at least I think so), which should make debugging less frustrating. There's also a nice DSL for defining the state machine.
For example, to implement this statemachine:
You would define it like so:
define_statemachine do
initial_state :HUNGRY
state :HUNGRY do
on :eat do
transition :to => :SATIATED, :if => :likes?
transition do
action do |monster|
puts "#{monster} says BLAH!!"
end
end
end
end
state :SATIATED do
enter do |monster|
puts "#{monster} says BURP!!!"
end
end
end
The state machine definition goes inside your Ruby class (or ActiveRecord model), endowing the class with finite state machine behavior:
require 'golem'
class Monster
include Golem
attr_accessor :state
def initialize(name)
@name = name
end
def to_s
@name
end
def likes?(food)
food.kind_of?(String)
end
define_statemachine do
# ...
end
end
m = Monster.new("Stringosaurus")
puts m.current_state # ==> :HUNGRY
m.eat(12345) # ==> "Stringosaurus says BLAH!!"
puts m.current_state # ==> :HUNGRY
m.eat("abcde") # ==> "Stringosaurus says BURP!!"
puts m.current_state # ==> :SATIATED
No comments:
Post a Comment