@Override
    public Object provide() {
      ContainerRequest request = getContainerRequest();

      Form form = getCachedForm(request, decode);

      if (form == null) {
        Form otherForm = getCachedForm(request, !decode);
        if (otherForm != null) {
          form = switchUrlEncoding(request, otherForm);
          cacheForm(request, form);
        } else {
          form = getForm(request);
          cacheForm(request, form);
        }
      }

      try {
        return extractor.extract(form.asMap());
      } catch (ExtractorException e) {
        throw new ParamException.FormParamException(
            e.getCause(), extractor.getName(), extractor.getDefaultValueString());
      }
    }