Sha256: 5e8e1ef22e7f7325cf5479e1663a32360b783b68773350315b2810ef06f59f83

Contents?: true

Size: 1.77 KB

Versions: 7

Compression:

Stored size: 1.77 KB

Contents

module NxtStateMachine
  module AttrAccessor
    module ClassMethods
      def state_machine(name = :default, state_attr: :state, target: nil, &config)
        machine = super(
          name,
          state_attr: state_attr,
          target: target,
          &config
        )

        machine.get_state_with do |target|
          if target.send(state_attr).nil?
            target.send("#{state_attr}=", initial_state.enum)
          end

          target.send(state_attr)
        end

        machine.set_state_with do |target, transition|
          transition.run_before_callbacks
          result = set_state(target, transition, state_attr)
          transition.run_after_callbacks

          result
        rescue StandardError => error
          target.send("#{state_attr}=", transition.from.enum)

          if error.is_a?(NxtStateMachine::Errors::TransitionHalted)
            false
          else
            raise
          end
        end

        machine.set_state_with! do |target, transition|
          transition.run_before_callbacks
          result = set_state(target, transition, state_attr)
          transition.run_after_callbacks

          result
        rescue StandardError
          target.send("#{state_attr}=", transition.from.enum)
          raise
        end

        machine
      end
    end

    module InstanceMethods
      private

      def set_state(target, transition, state_attr)
        transition.execute do |block|
          result = block ? block.call : nil
          set_state_result = target.send("#{state_attr}=", transition.to.enum)
          block ? result : set_state_result
        end
      end
    end

    def self.included(base)
      base.include(NxtStateMachine)
      base.include(InstanceMethods)
      base.extend(ClassMethods)
    end
  end
end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
nxt_state_machine-0.1.6 lib/nxt_state_machine/integrations/attr_accessor.rb
nxt_state_machine-0.1.5 lib/nxt_state_machine/integrations/attr_accessor.rb
nxt_state_machine-0.1.4 lib/nxt_state_machine/integrations/attr_accessor.rb
nxt_state_machine-0.1.3 lib/nxt_state_machine/integrations/attr_accessor.rb
nxt_state_machine-0.1.2 lib/nxt_state_machine/integrations/attr_accessor.rb
nxt_state_machine-0.1.1 lib/nxt_state_machine/integrations/attr_accessor.rb
nxt_state_machine-0.1.0 lib/nxt_state_machine/integrations/attr_accessor.rb