Draft mode for DataObject?

We are currently using relationships between "SiteTree" and "DataObject" classes. The only problem with this is that when someone makes changes to the data stored in the "DataObject" classes, it is immediately publishes live to the web. Our CMS users are familiar with the concept of drafts and they wonder why changes to data objects are published immediately.

What is the best way of making a draft mode for a DataObject? Simply having an additional "draft" field in the DataObject is not enough since a draft page should relate to a draft object, and a published page should relate to a published object.

See how far you get with that, with UserForms I had to also override several functions which versioned didn't seem to have any effect. Namely overriding doPublish() on the Page (not the dataobject) to publish the DataObjects (which where in a has_many). An example from UserForms...

The doPublish function has to be on your pagetype (not the dataobject) since all the publishing functionality is tied to pages you need to publish the dataobjects from a page. A reference of this is the userdefinedform module. UserDefinedForm has the doPublish() which goes through each object calling publish() the functionality. Some minor discussion about abstracting this process out - http://open.silverstripe.org/ticket/5609