geekq/workflow — pull request #74 by svoop (2013-03-09 11:02:12+00:00)
Title: Allow a workflow to be assigned an initial state different from the first state declared.

(I've had to move this into a branch in order to work on another issue simultanously - thus the new old pull request.)

My current use case is a model for outgoing payments with the following workflow:

workflow do
initial_state :pending

state :incomplete do
event :check, transitions_to: :pending
end

state :pending do
event :hold, transitions_to: :held
event :confirm, transitions_to: :sent
end

state :held do
event :release, transitions_to: :pending
end

state :sent
end

The payout falls into `:incomplete` state if the prerequisites (which are more than validations alone) are not met. However, a new payout should be born with `:pending` state for reasons beyond my control.

I could of course declare the `:incomplete` state last, but since one of the previous extensions of the workflow gem `include Comparable` and thus allow states to be compared by declaration order e.g. with `>` or `<`, the right place of this state is first.

The `initial_state` is completely optional. Unless present, the first state declared will automatically become the initial state and therefore this commit is fully backwards compatible and shouldn't break any existing code.

Thanks for considering this addition!