class Jsm::ClientExtension

Jsm::ClientExtension define all custom methods for the model that use the state machine class E.g: Define method for states

Attributes

event_executor[R]
klass[R]
state_machine[R]

Public Class Methods

decorate(klass, params = {}) click to toggle source
# File lib/jsm/client_extension.rb, line 4
def self.decorate(klass, params = {})
  client_extension = new(klass, params)
  client_extension.define_states_method
  client_extension.define_event_method
end
new(klass, params = {}) click to toggle source

@param options with options state_machine. It contain state_machine class( class inherited from Jsm::Base)

# File lib/jsm/client_extension.rb, line 12
def initialize(klass, params = {})
  @klass = klass
  @state_machine = params[:state_machine]
  @event_executor = klass.jsm_event_executor.new(state_machine: @state_machine)
  unless @state_machine.attribute_name
    raise Jsm::NoAttributeError, "please assign the attribute_name first in class #{@state_machine.name}"
  end
end

Public Instance Methods

define_event_method() click to toggle source

define all event that has been defined it consists of 3 types of method:

  • method to check whether can do event( e.g: can_married? )

  • method to run an event and return bollean( e.g: married )

  • method to run an event and raise error if failed( e.g: married! )

# File lib/jsm/client_extension.rb, line 38
def define_event_method
  state_machine.events.each do |event_name, event|
    event.attribute_name = state_machine.attribute_name
    define_can_event_method(event_name, event)
    define_event_execution_method(event_name, event)
    define_event_execution_method!(event_name, event)
  end
end
define_states_method() click to toggle source

define method for all states to check status equal with a states e.g: states: [:x, :y] it will define method `x?` and `y?`

# File lib/jsm/client_extension.rb, line 24
def define_states_method
  state_machine.states.each do |state|
    state_name = state.name
    klass.send(:define_method, "#{state_name}?".to_sym) do
      self.current_state == state_name
    end
  end
end

Private Instance Methods

define_can_event_method(event_name, event) click to toggle source
# File lib/jsm/client_extension.rb, line 48
def define_can_event_method(event_name, event)
  executor = event_executor
  klass.send(:define_method, "can_#{event_name}?") do
    executor.can_be_executed?(event, self)
  end
end
define_event_execution_method(event_name, event) click to toggle source
# File lib/jsm/client_extension.rb, line 55
def define_event_execution_method(event_name, event)
  executor = event_executor
  klass.send(:define_method, "#{event_name}") do
    executor.execute(event, self)
  end
end
define_event_execution_method!(event_name, event) click to toggle source
# File lib/jsm/client_extension.rb, line 62
def define_event_execution_method!(event_name, event)
  executor = event_executor
  klass.send(:define_method, "#{event_name}!") do
    executor.execute!(event, self)
  end
end