A quick check of the source code will tell you all you need to know...
save() is a wrapper function, that runs doSave() inside a transaction
doSave() first calls updateObject() then calls save() on the object
itself.
updateObject() is a method called just before the object is actually
saved,
Every do*() method is kind of hook which you can overwrite without much
impact on other parts form framework.
Of course you have to know what are you doing, but this is safest way to
extend/add your own logic.
Read