module Roda::RodaPlugins::Base::ClassMethods

def _define_roda_method_arg_numbers(callable)

or :required).
and whether the callable accepts keyword arguments (true, false
whether the callable accepts any additional arguments,
Return the number of required argument, optional arguments,
def _define_roda_method_arg_numbers(callable)
  optional_args = 0
  rest = false
  keyword = false
  callable.parameters.map(&:first).each do |arg_type, _|
    case arg_type
    when :opt
      optional_args += 1
    when :rest
      rest = true
    when :keyreq
      keyword = :required
    when :key, :keyrest
      keyword ||= true
    end
  end
  arity = callable.arity
  if arity < 0
    arity = arity.abs - 1
  end
  required_args = arity
  arity -= 1 if keyword == :required
  if callable.is_a?(Proc) && !callable.lambda?
    optional_args -= arity
  end
  [required_args, optional_args, rest, keyword]
end