class AASM::Core::Invokers::LiteralInvoker

record methods as state/event/transition callbacks.
Literal invoker which allows to use strings or symbols to call
#

def exec_subject

rubocop:disable Metrics/AbcSize
def exec_subject
  raise(*record_error) unless record.respond_to?(subject, true)
  return record.__send__(subject) if subject_arity.zero?
  return record.__send__(subject, *args) if subject_arity < 0
  req_args = args[0..(subject_arity - 1)]
  return record.__send__(subject, **req_args[0]) if req_args[0].is_a?(Hash)
  record.__send__(subject, *req_args)
end

def invoke_subject

def invoke_subject
  @result = exec_subject
end

def log_failure

def log_failure
  failures << subject
end

def may_invoke?

def may_invoke?
  subject.is_a?(String) || subject.is_a?(Symbol)
end

def record_error

def record_error
  [
    NoMethodError,
    'NoMethodError: undefined method ' \
    "`#{subject}' for #{record.inspect}:#{record.class}"
  ]
end

def subject_arity

def subject_arity
  @arity ||= record.__send__(:method, subject.to_sym).arity
end