slot-value-using-class. You might consider this a stupid CLOS trick. You could just as well establish an abstraction layer through other means, but the point is to create an understandable abstraction model. It is easy to understand what is going to happen if we override
We use the MOP to create a new kind of slot so that we can compose values on the fly when the programmer calls
slot-value-using-class. We also override
(setf slot-value-using-class)so that it calls the "diff" computing code. Again, the point is to make it easy to understand what is happening.
The end result is the
versioned-standard-object. An instance of a
versioned-standard-object(or any of it's inheritors, naturally), has all its slots implemented versioned value objects. The programmer should specify
versioned-standard-classas the metaclass in the class definition.
(defclass test-class () ((nvi-slot :version-technique :nonlogged :accessor test-class/nvi-slot) (lnvi-slot :version-technique :logged :accessor test-class/lnvi-slot) (svi-slot :version-technique :scalar :accessor test-class/svi-slot)) (:metaclass versioned-standard-class) (:schema-version 0))In this example, the test class has some of the different kinds of versioned values that are named by the version technique. A
:nonloggedslot is the "escape mechanism". It's a fancy name for "Just turn off the versioning, and use this here value."
:loggedslot is less drastic. There's no versioning behavior, it's just a persistent slot, but we'll keep a list of the transactions that modified it.
:scalarversion technique is one where the last chronologically participating change has the value.
A versioned slot using the
:composite-sequenceuses a set of diffs to represent the versioned slot value, and these are composed as described in an earlier post.
(defclass test-cvi-class () ((cvi-slot-a :version-technique :composite-sequence :accessor test-cvi-class/cvi-slot-a) (cvi-slot-b :version-technique :composite-sequence) (cvi-slot-c :version-technique :composite-sequence :initform nil)) (:metaclass versioned-standard-class) (:schema-version 0))
Once this is working, we have what we need to bootstrap the rest of the versioned storage.