docs: def edit(self, name=None, description=None, unit=None, options=None, **kwargs):
          """
          Edit the details of a property (model).
  
          :param name: (optional) new name of the property to edit
          :type name: basestring or None
          :param description: (optional) new description of the property
          :type description: basestring or None
          :param unit: (optional) new unit of the property
          :type unit: basestring or None
          :param options: (options) new options of the property
          :type options: dict
          :param kwargs: (optional) additional kwargs to be edited
          :type kwargs: dict or None
          :return: None
          :raises APIError: When unable to edit the property
          :raises IllegalArgumentError: when the type of the input is provided incorrect.
  
          Examples
          --------
          >>> front_fork = project.part('Front Fork')
          >>> color_property = front_fork.property(name='Color')
          >>> color_property.edit(name='Shade', description='Could also be called tint, depending on mixture',
          >>> unit='RGB')
  
          --------
          >>> wheel_property_reference = self.project.model('Bike').property('Reference wheel')
          >>> wheel_model = self.project.model('Wheel')
          >>> diameter_property = wheel_model.property('Diameter')
          >>> spokes_property = wheel_model.property('Spokes')
          >>> prefilters = {'property_value': diameter_property.id + ":{}:lte".format(15)}
          >>> propmodels_excl = [spokes_property.id]
          >>> options = dict()
          >>> options['prefilters'] = prefilters
          >>> options['propmodels_excl'] = propmodels_excl
          >>> wheel_property_reference.edit(options=options)
  
          """
          update_dict = {'id': self.id}
          if name:
              if not isinstance(name, (str, text_type)):
                  raise IllegalArgumentError(
                      "name should be provided as a string, was provided as '{}'".format(type(name)))
              update_dict.update({'name': name})
              self.name = name
          if description:
              if not isinstance(description, (str, text_type)):
                  raise IllegalArgumentError("description should be provided as a string, was provided as '{}'".
                                             format(type(description)))
              update_dict.update({'description': description})
          if unit:
              if not isinstance(unit, (str, text_type)):
                  raise IllegalArgumentError("unit should be provided as a string, was provided as '{}'".
                                             format(type(unit)))
              update_dict.update({'unit': unit})
          if options:
              if not isinstance(options, dict):
                  raise IllegalArgumentError("options should be provided as a dict, was provided as '{}'".
                                             format(type(options)))
              update_dict.update({'options': options})
          if kwargs:
              # process the other kwargs in py27 style.
              for key, value in iteritems(kwargs):
                  update_dict[key] = value
  
          r = self._client._request('PUT', self._client._build_url('property', property_id=self.id), json=update_dict)
  
          if r.status_code != requests.codes.ok:  # pragma: no cover
              raise APIError("Could not update Property ({})".format(r))