class RMachine::CallEventMethodNotifier

Attributes

change_state_value_notifier[R]
entity_with_state[R]
message_args[R]
method_to_call[R]
state_template[R]

Public Class Methods

new(params) click to toggle source
# File lib/r_machine/notifiers/call_event_method_notifier.rb, line 6
def initialize(params)
  @entity_with_state = params[:entity]
  @state_template = params[:state_template]
  @method_to_call = params[:method_to_call]
  @message_args = params[:message_args]
  @change_state_value_notifier = params[:change_state_value_notifier]
end

Public Instance Methods

notify!() click to toggle source
# File lib/r_machine/notifiers/call_event_method_notifier.rb, line 14
def notify!
  event = state_template.find_event(method_to_call)

  success = false
  event.rules.each do |rule|
    if rule.must_have_specific_state?
      if is_in_state?(rule.state_should_be)
        if rule.has_conditional?
          if execute_conditional_method(rule.conditional_method, message_args) == true
            change_current_state_value_to(rule.change_to)
            success = true
          end
        else
          change_current_state_value_to(rule.change_to)
          success = true
        end
      end
    else
      change_current_state_value_to(rule.change_to)
      success = true
    end
    break if success == true
  end

  raise StateTransactionNotPermittedError if success == false
end

Private Instance Methods

change_current_state_value_to(value) click to toggle source
# File lib/r_machine/notifiers/call_event_method_notifier.rb, line 51
def change_current_state_value_to(value)
  ChangeStateValueNotifier.new({
    state_template: state_template,
    new_value: value
  }).notify!
end
execute_conditional_method(method, args_to_send) click to toggle source
# File lib/r_machine/notifiers/call_event_method_notifier.rb, line 47
def execute_conditional_method(method, args_to_send)
  entity_with_state.send(method, *args_to_send)
end
is_in_state?(state) click to toggle source
# File lib/r_machine/notifiers/call_event_method_notifier.rb, line 43
def is_in_state?(state)
  state_template.state == state
end