module Captio::Stateful::ClassMethods

Public Instance Methods

states(*states) click to toggle source
# File lib/captio/stateful.rb, line 14
def states(*states)

  states.each do |state|
    define_method(state.to_s + "?") do
      state == self.state
    end
  end

  define_singleton_method('states') do
    states
  end

  define_method('state') do
    @state ||= states.first
    @state
  end

  attr_writer :state

end
verb(name, state: nil, &block) click to toggle source
# File lib/captio/stateful.rb, line 35
def verb(name, state: nil, &block)
  raise ArgumentError, "Verbs must have a valid initial state" if state.nil? || !states.include?(state)

  define_method(name.to_s + "!") do
    raise StateSequenceError, "Cannot `#{name}` when the state is #{self.state}." unless self.state == state
    self.state = self.class.states.at(self.class.states.index(state) + 1)
    instance_eval(&block) if block_given?
  end
end