docs: def preference_form_builder(form_base_class, preferences=[], **kwargs):
      """
      Return a form class for updating preferences
      :param form_base_class: a Form class used as the base. Must have a ``registry` attribute
      :param preferences: a list of :py:class:
      :param section: a section where the form builder will load preferences
      """
      registry = form_base_class.registry
      preferences_obj = []
      if len(preferences) > 0:
          # Preferences have been selected explicitly
          for pref in preferences:
              if isinstance(pref, string_types):
                  preferences_obj.append(registry.get(name=pref))
              elif type(pref) == tuple:
                  preferences_obj.append(
                      registry.get(name=pref[0], section=pref[1]))
              else:
                  raise NotImplementedError(
                      "The data you provide can't be converted to a Preference object")
      elif kwargs.get('section', None):
          # Try to use section param
          preferences_obj = registry.preferences(
              section=kwargs.get('section', None))
  
      else:
          # display all preferences in the form
          preferences_obj = registry.preferences()
  
      fields = OrderedDict()
      instances = []
      model_kwargs = kwargs.get('model', {})
      manager = registry.manager(**model_kwargs)
  
      for preference in preferences_obj:
          f = preference.field
          instance = manager.get_db_pref(
              section=preference.section.name, name=preference.name)
          f.initial = instance.value
          fields[preference.identifier()] = f
          instances.append(instance)
  
      form_class = type(
          'Custom' + form_base_class.__name__, (form_base_class,), {})
      form_class.base_fields = fields
      form_class.preferences = preferences_obj
      form_class.instances = instances
      return form_class