Skip to content

Commit

Permalink
Add a state_transitions(requirements = {}) method
Browse files Browse the repository at this point in the history
  • Loading branch information
Gurpartap committed May 28, 2012
1 parent dee8f11 commit 8b423d0
Showing 1 changed file with 21 additions and 0 deletions.
21 changes: 21 additions & 0 deletions lib/simple_states.rb
Expand Up @@ -48,6 +48,7 @@ def event(name, options = {})
end

attr_reader :past_states
attr_accessor :state_transitions

def init_state
self.state = self.class.initial_state if state.nil?
Expand All @@ -57,6 +58,26 @@ def past_states
@past_states ||= []
end

def state_transitions(requirements = {})
on ||= requirements[:on]
from ||= requirements[:from]
to ||= requirements[:to]
events.map { |event| { :options => event.options, :name => event.name} }.select { |event|
if on.present?
event[:name].eql?(on.try(:to_sym))
elsif from.present? && to.present?
[*event[:options].from].include?(from.try(:to_sym)) && [*event[:options].to].include?(to.try(:to_sym))
elsif from.present?
[*event[:options].from].include?(from.try(:to_sym))
elsif to.present?
[*event[:options].to].include?(to.try(:to_sym))
else
from = self.state
[*event[:options].to].include?(from.try(:to_sym))
end
}.map { |event| { :event => event[:name], :from => from.present? ? from : event[:options].from, :to => to.present? ? to : event[:options].to } }
end

def state?(state, include_past = false)
include_past ? was_state?(state) : self.state.try(:to_sym) == state.to_sym
end
Expand Down

0 comments on commit 8b423d0

Please sign in to comment.