class AASM::Core::Invokers::ProcInvoker

state/event/transition callbacks.
Proc invoker which allows to use Procs as
#

def exec_proc(parameters_size)

rubocop:disable Metrics/AbcSize
def exec_proc(parameters_size)
  return record.instance_exec(&subject) if parameters_size.zero? && !keyword_arguments?
  
  if keyword_arguments?
    exec_proc_with_keyword_args(parameters_size)
  elsif parameters_size < 0
    record.instance_exec(*args, &subject)
  else
    record.instance_exec(*args[0..(parameters_size - 1)], &subject)
  end
end

def exec_proc_with_keyword_args(parameters_size)

def exec_proc_with_keyword_args(parameters_size)
  positional_args, keyword_args = parse_arguments
  if keyword_args.nil?
    if parameters_size < 0
      record.instance_exec(*positional_args, &subject)
    else
      record.instance_exec(*positional_args[0..(parameters_size - 1)], &subject)
    end
  else
    if parameters_size < 0
      record.instance_exec(*positional_args, **keyword_args, &subject)
    else
      record.instance_exec(*positional_args[0..(parameters_size - 1)], **keyword_args, &subject)
    end
  end
end

def invoke_subject

def invoke_subject
  @result = if support_parameters?
              exec_proc(parameters_to_arity)
            else
              exec_proc(subject.arity)
            end
end

def keyword_arguments?

def keyword_arguments?
  return false unless support_parameters?
  subject.parameters.any? { |type, _| [:key, :keyreq].include?(type) }
end

def log_failure

def log_failure
  return log_source_location if Method.method_defined?(:source_location)
  log_proc_info
end

def log_proc_info

def log_proc_info
  failures << subject
end

def log_source_location

def log_source_location
  failures << subject.source_location.join('#')
end

def may_invoke?

def may_invoke?
  subject.is_a?(Proc)
end

def parameters_to_arity

def parameters_to_arity
  subject.parameters.inject(0) do |memo, parameter|
    case parameter[0]
    when :key, :keyreq
      # Keyword arguments don't count towards positional arity
    when :rest
      memo = memo > 0 ? -memo : -1
    else
      memo += 1
    end
    memo
  end
end

def support_parameters?

def support_parameters?
  subject.respond_to?(:parameters)
end