def set_property_value(prop, value)
      prop = self.class.property(prop) if Symbol === prop
      if prop.domain? and prop.collection? then
        clear_attribute(prop.attribute)
        merge_attribute(prop.attribute, value)
      else
        set_typed_property_value(prop, value)
      end
    end
def set_property_value(prop, value)
      prop = self.class.property(prop) if Symbol === prop
      if prop.domain? and prop.collection? then
        clear_attribute(prop.attribute)
        merge_attribute(prop.attribute, value)
      else
        set_typed_property_value(prop, value)
      end
    end
Sets this domain object's attribute to the value. This method clears the current attribute value,
 if any, and merges the new value. Merge rather than assignment ensures that a collection type
 is preserved, e.g. an Array value is assigned to a set domain type by first clearing the set
 and then merging the array content into the set.

 @param [Property, Symbol] prop the property or attribute to set
 @param value the new value