diff --git a/stateful/README.txt b/stateful/README.txt index 4179269..ef27cdb 100644 --- a/stateful/README.txt +++ b/stateful/README.txt @@ -28,7 +28,6 @@ state. We can now execute the `finish` Transition. >>> demo.doTransition('finish') - 'finish' >>> demo.getState() 'finished' diff --git a/stateful/base.py b/stateful/base.py index 9107dab..c617282 100644 --- a/stateful/base.py +++ b/stateful/base.py @@ -53,14 +53,17 @@ class Stateful(object): def doTransition(self, transition, historyInfo=None): sd = self.getStatesDefinition() + previousState = self.getState() if isinstance(transition, basestring): sd.doTransitionFor(self, transition) - return transition + self.notify(transition, previousState) + return available = [t.name for t in sd.getAvailableTransitionsFor(self)] for tr in transition: if tr in available: sd.doTransitionFor(self, tr) - return tr + self.notify(tr, previousState) + return raise ValueError("None of the transitions '%s' is available for state '%s'." % (repr(transition), self.getState())) @@ -74,6 +77,10 @@ class Stateful(object): def getStatesDefinition(self): return statesDefinitions.get(self.statesDefinition, None) + def notify(self, transition, previousState): + """ To be implemented by subclass. + """ + class StatefulAdapter(Stateful): """ An adapter for persistent objects to make them stateful. @@ -98,11 +105,9 @@ class StatefulAdapter(Stateful): statesAttr[self.statesDefinition] = value state = property(getState, setState) - def doTransition(self, transition, historyInfo=None): - previousState = self.getState() - transition = super(StatefulAdapter, self).doTransition(transition, historyInfo) - transition = self.getStatesDefinition().transitions[transition] - notify(TransitionEvent(self.context, transition, previousState)) + def notify(self, transition, previousState): + transObject = self.getStatesDefinition().transitions[transition] + notify(TransitionEvent(self.context, transObject, previousState)) class IndexInfo(object):