Another approach is using separate repositories for storing data and revision history, it can be implemented as events, I think Tres Seaver was talking about that in this thread:
some_obj = some_objects.get(123) user = request.user # mutate some_obj event = SomeObjectChanged(some_obj, user) some_objects.store(some_obj) event_manager.fire(event) and then in the event listener: def handle_some_obj_changed(event): some_objects_versions.store_revision(event.some_obj, event.user) The event_manager could be ZCA event API. You could also move event-firing logic inside subclass of class of some_objects repository: class VersionedSomeObjectsRepository(object): def __init__(self, some_objects, user): self.user = user self.some_objects = some_objects def store(self, some_obj): self.some_objects.store(some_obj) event = SomeObjectChanged(some_obj, self.user) event_manager.fire(event) def __getattr__(self, name): return getattr(self.some_objects, name) So the above snippet could be simplified in: versioned_some_objects = VersionedSomeObjectsRepository(some_objects, request.user) some_obj = versioned_some_objects.get(123) # mutate some_obj versioned_some_objects.store(some_obj) You can also preconfigure versioned repositories in application middleware. -- You received this message because you are subscribed to the Google Groups "pylons-devel" group. To post to this group, send email to pylons-devel@googlegroups.com. To unsubscribe from this group, send email to pylons-devel+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/pylons-devel?hl=en.