code: def add_conversion_step(self, converter: Converter[S, T], inplace: bool = False):
          
          # it the current chain is generic, raise an error
          if self.is_generic() and converter.is_generic():
              raise ValueError('Cannot chain this generic converter chain to the provided converter : it is generic too!')
  
          # if the current chain is able to transform its input into a valid input for the new converter
          elif converter.can_be_appended_to(self, self.strict):
              if inplace:
                  self._converters_list.append(converter)
                  # update the current destination type
                  self.to_type = converter.to_type
                  return
              else:
                  new = copy(self)
                  new._converters_list.append(converter)
                  # update the current destination type
                  new.to_type = converter.to_type
                  return new
          else:
              raise TypeError('Cannnot register a converter on this conversion chain : source type \'' +
                              get_pretty_type_str(converter.from_type)
                              + '\' is not compliant with current destination type of the chain : \'' +
                              get_pretty_type_str(self.to_type) + ' (this chain performs '
                              + ('' if self.strict else 'non-') + 'strict mode matching)')
docs: Utility method to add a converter to this chain. If inplace is True, this object is modified and
          None is returned. Otherwise, a copy is returned
  
          :param converter: the converter to add
          :param inplace: boolean indicating whether to modify this object (True) or return a copy (False)
          :return: None or a copy with the converter added