Big machine is a Gem which give state to your object
Bugs
Development
Testing
Source
- git://github.com/alaibe/big_machine.git
Add this to your Gemfile
gem 'big_machine'
Create your first state
class Draft < BigMachine::State
def publish
transition_to Online
end
end
class Online < BigMachine::State
end
All methods you override in you state can takes args and block
class Draft < BigMachine::State
def publish(now = Time.now)
transition_to Online, now
end
end
class Online < BigMachine::State
def enter(*args)
stateful.publish_at args.first
end
end
Make your object stateful
class Car
include BigMachine
big_machine initial_state: :draft
end
Now it's possible to publish your car object:
car = Car.new
car.current_state # => Draft
car.publish
car.current_state # => Online
Of course your object can be an ActiveRecord::Base object. In this case, the object must have a state column. ( if not, see the next section )
big_machine method can take several options:
- initial_state is the only one necessary option
- state_attribute is available only if the object is an active record object
- workflow if you want to change the normal worklow It's possible to call workflow_is method in your different states
big_machine initial_state: :dradt, state_attribute: :big_state, workflow: small
class Draft < BigMachine::State
def publish
return if workflow_is :small
transition_to Online
end
end
A state can include lock module, it will lock the state of your object when your enter in it. The unlock method should be call to unlock the module
class Draft < BigMachine::State
include BigMachine::Lock
def publish
transition_to Online
end
end
class Article
include BigMachine
big_machine initial_state: :dradt
end
article = Article.new
article.publish
article.current_state # => Draft
article.unlock
article.publish
article.current_state # => Online
*Anthony Laibe