Sha256: f898dc9fa3274326355132396927104530684b02dd2cddfe1f34d1262c41fe19

Contents?: true

Size: 1.86 KB

Versions: 3

Compression:

Stored size: 1.86 KB

Contents

module StateMachina
  class Machine
    attr_reader :model_name, :name, :column_name, :metadata
    attr_accessor :model

    def initialize(model_name, name, column_name: :state, metadata: {})
      @model_name = model_name
      @name = name.to_s
      @column_name = column_name
      @metadata = metadata
    end

    def state(state_name, metadata: {})
      state = StateMachina::State.new(model_name, name, state_name, metadata: metadata)

      StateMachina::Registry.register_state(state)
    end

    def event(event_name, metadata: {})
      event = StateMachina::Event.new(model_name, name, event_name, metadata: metadata)

      yield(StateMachina::Registry.register_event(event))
    end

    def states
      states = StateMachina::Registry.find_states(model_name, name).values
      states.each do |state|
        state.machine = self
      end

      StateMachina::StatesCollection.new(states)
    end

    def events(possible: false, permitted: false, guard_context: model)
      events = StateMachina::Registry.find_events(model_name, name).values
      events.each do |event|
        event.machine = self
        event.guard_context = guard_context
      end

      events = select_possible_events(events) if possible || permitted
      events = select_permitted_events(events) if permitted

      StateMachina::EventsCollection.new(events)
    end

    def current_state_name
      model.public_send(column_name)
    end

    def current_state
      states.find_by_name(current_state_name)
    end

    def update_state(new_state)
      if model.respond_to?(:update)
        model.update(column_name => new_state)
      else
        model.public_send("#{column_name}=", new_state)
      end
    end

    private

    def select_possible_events(events)
      events.select(&:possible?)
    end

    def select_permitted_events(events)
      events.select(&:permitted?)
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
state_machina-0.1.3 lib/state_machina/machine.rb
state_machina-0.1.2 lib/state_machina/machine.rb
state_machina-0.1.1 lib/state_machina/machine.rb