Sha256: fd6e352f7bdc355c79fd237afd8653101e49c4865487c161879f919629be47b2

Contents?: true

Size: 1.5 KB

Versions: 2

Compression:

Stored size: 1.5 KB

Contents

module RailsStateMachine
  class StateManager
    attr_accessor :next_event, :state_before_state_event
    attr_reader :state_attribute

    def initialize(record, state_machine, state_attribute)
      @record = record
      @state_machine = state_machine
      @state_attribute = state_attribute
    end

    def state
      @record.public_send(@state_attribute)
    end

    def state_in_database
      @record.public_send(:"#{@state_attribute}_in_database").to_s
    end

    def state=(value)
      @record.public_send(:"#{@state_attribute}=", value)
    end

    def revert
      if @next_event
        self.state = @state_before_state_event
        self.state_event = @next_event.name
      end
    end

    def source_state
      if @record.new_record?
        state
      else
        state_in_database
      end
    end

    def state_event
      @record.public_send(:"#{@state_machine.state_attribute}_event")
    end

    def state_event=(value)
      @record.public_send(:"#{@state_machine.state_attribute}_event=", value)
    end

    def transition_allowed_for?(event_name)
      !!@state_machine.find_event(event_name)&.allowed_from?(state)
    end

    def transition_to(event_name)
      if transition_allowed_for?(event_name)
        self.state_before_state_event = source_state
        event = @state_machine.find_event(event_name)
        self.state = event.future_state_name(state).to_s
        self.state_event = nil
        @next_event = event

        true
      else
        false
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
rails_state_machine-3.1.0 lib/rails_state_machine/state_manager.rb
rails_state_machine-3.0.0 lib/rails_state_machine/state_manager.rb