Clear should remove all additional properties. Clean should keep the properties.
Add unittest if it does not exist
The clear function supposedly erases all properties in addition to the clean call. Depending on how you define "erase" the property works as expected, as it swaps all values of all properties with fresh constructed ones, supposedly freeing the memory.
What it not does is deleting properties, which one might think it does. If this function is to be extended to delete custom properties, we need a mechanism to distinguish custom properties from built in properties. Deleting all properties will cause problems with the unittests, as we cannot add vertices to a mesh that has no properties at all.
My first proposed extension to distinguish internal from custom properties would be to store a list of propertyHandles that correspond to internal properties. Requesting status or other properties has to add the respective handle to that list. Especially handling internal properties of derived classes would be no problem with this approach.
As an alternative i would propose to extend the properties by a boolean flag that indicates whether they are internal (our builtin) properties. in the clear function one only has to check for this flag.
However distinguishing between builtin properties and custom properties is an important feature and not only relevant for this scenario, it would also be very useful when meshes are merged. (see OpenFlipper-Free/OpenFlipper-Free#92)