Sha256: dc59d3799ea942bc1260f352689b35e4ffbfb02332b0bc3346cfe51048eddefc

Contents?: true

Size: 1.17 KB

Versions: 3

Compression:

Stored size: 1.17 KB

Contents

require "state_machinable/version"
require 'active_support'

module StateMachinable
  extend ActiveSupport::Concern

  class_methods do
    def state_machine_class
      "#{self}StateMachine".constantize
    end

    def transition_class
      "#{self}Transition".constantize
    end
  end

  included do
    before_save :send_ev_before_save, :if => Proc.new { |obj| obj.changed? }
    after_save :send_ev_after_save, :if => Proc.new { |obj| !obj.id_changed? && obj.changed? }
    after_save :transition_to_initial_state, :if => Proc.new { |obj| obj.id_changed? }
    delegate :can_transition_to?, :transition_to!, :transition_to, :to => :state_machine

    def state_machine
      @state_machine ||= self.class.state_machine_class.new(self, :transition_class => self.class.transition_class)
    end

    def send_ev_before_save
      self.state_machine.send('ev_before_save')
    end

    def send_ev_after_save
      self.state_machine.send('ev_after_save')
    end

    private def transition_to_initial_state
      if !self.respond_to?(:skip_state_machine?) || !self.skip_state_machine?
        self.transition_to!(self.state_machine.class.successors['initial'].first)
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
state_machinable-0.0.4 lib/state_machinable.rb
state_machinable-0.0.2 lib/state_machinable.rb
state_machinable-0.0.1 lib/state_machinable.rb