docs: def update_from_obj(self, obj, copy=False):
          """
          Updates this configuration object from another.
  
          See :meth:`ConfigurationObject.update` for details.
  
          :param obj: Values to update the ConfigurationObject with.
          :type obj: ConfigurationObject
          :param copy: Copies lists and dictionaries.
          :type copy: bool
          """
          obj.clean()
          obj_config = obj._config
          all_props = self.__class__.CONFIG_PROPERTIES
          if copy:
              for key, value in six.iteritems(obj_config):
                  attr_config = all_props.get(key)
                  if attr_config:
                      attr_type = attr_config.attr_type
                      if attr_type:
                          if issubclass(attr_type, list):
                              self._config[key] = value[:]
                          elif attr_type is dict:
                              self._config[key] = value.copy()
                      else:
                          self._config[key] = value
                      self._modified.discard(key)
          else:
              filtered_dict = {key: value
                               for key, value in six.iteritems(obj_config)
                               if key in all_props}
              self._config.update(filtered_dict)
              self._modified.difference_update(filtered_dict.keys())