README.md
# Big machine [![Build Status](https://secure.travis-ci.org/alaibe/big_machine.png)][travis] [![Dependency Status](https://gemnasium.com/alaibe/big_machine.png)][gemnasium] [![Code Climate](https://codeclimate.com/badge.png)][codeclimate]
[travis]: http://travis-ci.org/alaibe/big_machine
[gemnasium]: https://gemnasium.com/alaibe/big_machine
[codeclimate]: https://codeclimate.com/github/alaibe/big_machine
Big machine is a Gem which give state to your object
## Resources
Bugs
* http://github.com/alaibe/big_machine/issues
Development
* http://github.com/alaibe/big_machine
Testing
* http://travis-ci.org/alaibe/big_machine
Source
* git://github.com/alaibe/big_machine.git
## Install
Add this to your Gemfile
``` ruby
gem 'big_machine'
```
## Usage
Create your first state
``` ruby
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
``` ruby
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
``` ruby
class Car
include BigMachine
big_machine initial_state: :draft
end
```
Now it's possible to publish your car object:
``` ruby
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 options
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
## Example
``` ruby
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
```
## Lock module
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
``` ruby
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
```
## Contributors
*Anthony Laibe
[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/alaibe/big_machine/trend.png)](https://bitdeli.com/free "Bitdeli Badge")