docs: def addFeature(self, f, conflict="error", missing="other"):
          """
          Add a feature.
  
          Args:
  
          - f(Feature): feature to add.
          - conflict(str): if a property hasn't compatible values/constrains, do:
             - ``"error"``: raise exception.
             - ``"ignore"``: go on.
             - ``"me"``: keep the old value.
             - ``"other"``: set the passed value.
          - missing(str): if a property has not been set yet, do:
             - ``"error"``: raise exception.
             - ``"ignore"``: do nothning.
             - ``"me"``: do nothing.
             - ``"other"``: set the passed value.
          """
  
          OPTIONS = ["error", "ignore", "me", "other"]
          assert missing in OPTIONS, "Invalid value in `missing`."
          assert conflict in OPTIONS, "Invalid value in `missing`."
  
          if f.prop not in self.props and missing == "error":
              raise Exception("Property has not set.")
          elif f.prop not in self.props and missing in ["ignore", "first"]:
              return
  
          if isinstance(f.value, int) or isinstance(f.value, float):
              if f.operator == "=":
                  inter1 = (f, f)
              elif f.operator[0] == "<":
                  inter1 = (None, f)
              elif f.operator[0] == ">":
                  inter1 = (f, None)
              inter0 = self.props.get(f.prop, (None, None))
              try:
                  self.props[f.prop] = Features._applyInter(inter0, inter1, conflict)
              except Exception as e:
                  raise RADLParseException("%s. Involved features: %s" % (e, [str(f0) for f0 in inter0]),
                                           line=f.line)
          elif isinstance(f, SoftFeatures):
              self.props.setdefault(f.prop, []).append(f)
          elif f.operator == "contains":
              if f.prop in self.props and f.value.getValue("name") in self.props[f.prop]:
                  feature = self.props[f.prop][f.value.getValue("name")].clone()
                  for f0 in f.value.features:
                      feature.value.addFeature(f0, conflict, missing)
                  self.props[f.prop][f.value.getValue("name")] = feature
              else:
                  self.props.setdefault(f.prop, {})[f.value.getValue("name")] = f
          else:
              value0 = self.props.get(f.prop, None)
              if not value0 or (conflict == "other"):
                  self.props[f.prop] = f
              elif value0.value != f.value and conflict == "error":
                  raise RADLParseException("Conflict adding `%s` because `%s` is already set and conflict is"
                                           " %s" % (f, value0, conflict), line=f.line)