Sha256: cc944048929dfbaaccdcfed8dcb25fbb29d39abd2d3402780e7dc1033039799b

Contents?: true

Size: 1.44 KB

Versions: 4

Compression:

Stored size: 1.44 KB

Contents

module EndState
  class Transition
    attr_reader :state, :blocked_event_message
    attr_accessor :action, :guards, :finalizers

    def initialize(state)
      @state = state
      @action = Action
      @guards = []
      @finalizers = []
    end

    def allowed?(object, params={})
      guards.all? { |guard| guard.new(object, state, params).allowed? }
    end

    def will_allow?(object, params={})
      guards.all? { |guard| guard.new(object, state, params).will_allow? }
    end

    def finalize(object, previous_state, params={})
      finalizers.each_with_object([]) do |finalizer, finalized|
        finalized << finalizer
        return rollback(finalized, object, previous_state, params) unless run_finalizer(finalizer, object, state, params)
      end
      true
    end

    def custom_action(action)
      @action = action
    end

    def guard(guard)
      guards << guard
    end

    def finalizer(finalizer)
      finalizers << finalizer
    end

    def persistence_on
      finalizer Finalizers::Persistence
    end

    def blocked(message)
      @blocked_event_message = message
    end

    private

    def rollback(finalized, object, previous_state, params)
      action.new(object, previous_state).rollback
      finalized.reverse.each { |finalizer| finalizer.new(object, state, params).rollback }
      false
    end

    def run_finalizer(finalizer, object, state, params)
      finalizer.new(object, state, params).call
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
end_state-0.4.0 lib/end_state/transition.rb
end_state-0.3.2 lib/end_state/transition.rb
end_state-0.3.1 lib/end_state/transition.rb
end_state-0.3.0 lib/end_state/transition.rb