docs: def set_property(self, key, value):
          '''Set a new (or updating existing) key value pair.
  
          Args:
              key: A string containing the key namespace
              value: A str, int, or bool value
  
          Raises:
              NotImplementedError: an unsupported value-type was provided
          '''
          value_type = type(value)
          if value_type not in [str, int, bool]:
              raise NotImplementedError(
                  'Only string, integer, and boolean properties are implemented')
  
          key_object = self.properties.findChild(name='key', text=key)
  
          # Key (and value, if it's a valid property list) don't exist
          if key_object is None:
              key_object = self.soup.new_tag('key')
              key_object.string = key
  
              self.properties.append(key_object)
  
              value_object = self.soup.new_tag(
                  {str: 'string', int: 'integer', bool: str(value).lower()}[
                      value_type])
              if value_type is not bool:
                  value_object.string = str(value)
  
              self.properties.append(value_object)
  
              return
  
          # Key (and value, if it's a valid property list) exist
          # Eh, just remove the key+value tags from the tree and re-add them
          # (with the new value)
          value_object = key_object.find_next_sibling()
  
          key_object.decompose()
          value_object.decompose()
  
          self.set_property(key, value)