class Shoulda::Matchers::ActionController::PermitMatcher::ParametersDoubleRegistry

@private

def self.permitted_parameter_names_within(double_collection)

def self.permitted_parameter_names_within(double_collection)
  double_collection.calls_to(:permit).map(&:args).flatten
end

def initialize(params)

def initialize(params)
  @params = params
  @double_collections_by_parameter_name = {}
end

def permitted_parameter_names(args = {})

def permitted_parameter_names(args = {})
  subparameter_name = args.fetch(:for, TOP_LEVEL)
  if double_collections_by_parameter_name.key?(subparameter_name)
    self.class.permitted_parameter_names_within(
      double_collections_by_parameter_name[subparameter_name]
    )
  else
    []
  end
end

def register

def register
  register_double_for_permit_against(params, TOP_LEVEL)
end

def register_double_for_permit_against(params, subparameter_name)

def register_double_for_permit_against(params, subparameter_name)
  klass = params.singleton_class
  double_collection = Doublespeak.double_collection_for(klass)
  register_double_for_permit_on(double_collection)
  register_double_for_require_on(double_collection)
  double_collections_by_parameter_name[subparameter_name] =
    double_collection
end

def register_double_for_permit_on(double_collection)

def register_double_for_permit_on(double_collection)
  double_collection.register_proxy(:permit)
end

def register_double_for_require_on(double_collection)

def register_double_for_require_on(double_collection)
  double_collection.register_proxy(:require).to_return do |call|
    params = call.return_value
    subparameter_name = call.args.first
    register_double_for_permit_against(params, subparameter_name)
  end
end