module Dry::Initializer::Dispatchers::PrepareDefault

def call(default: nil, optional: nil, **options)

def call(default: nil, optional: nil, **options)
  default = callable! default
  check_arity! default
  {default:, optional: (optional | default), **options}
end

def callable!(default)

def callable!(default)
  return unless default
  return default if default.respond_to?(:call)
  return callable(default.to_proc) if default.respond_to?(:to_proc)
  invalid!(default)
end

def check_arity!(default)

def check_arity!(default)
  return unless default
  arity = default.method(:call).arity.to_i
  return unless arity.positive?
  invalid!(default)
end

def invalid!(default)

def invalid!(default)
  raise TypeError, "The #{default.inspect} should be" \
                   " either convertable to proc with no arguments," \
                   " or respond to #call without arguments."
end