Yes, if we offered a nice clean place to put all of those, it would make it obvious
where to put validation. (I will certainly think about that in the future.)
Here is a technique that I use, that is very effective for me, but not generally
applicable: I use DCM, which is in the contrib directory and basically provides
wrappers for the create/read/update/destory operations, similar to those you
name below. I use :after methods on these operations (specialized on Director
classes, since it is generally class dependedent) to send objects to a text indexer
in a background thread whenever they change. (I was using Lucene-ws but now
use montezuma; it makes sense to do these operations in a back-ground thread since
a web-service call might block the thread that needs to get a response on to the
glass as fast as possible.)
This is an extraordinarily powerful and elegant feature of LISP. If you have a method
that gives you a "change point" (I believe that is what you are asking for) then you can
easily put a :before method in a completely different file that performs validation and
signals an exception or takes some other action that interrupts the intended operation.
One of the beauties of this is that the validation rules can be easily kept quite separate from the rest of the code.
I suppose this same technique could be applied even if you do not have clearly defined
methods; but personally I consider this clarity to be one of the advantages of the DCM code.
Of course, one can more or less easily create your own validation points, without becoming
dependeing on the DCM code.
Here's my example code:
(defmethod register-obj :after ((dir indexing-director) (mo managed-object))
(pub-and-proc (list "indexdocument" dir (k (mid mo))))
)
(defmethod delete-obj :before ((dir indexing-director) (id key))
(pub-and-proc (list "removedocument" dir (k id)))
)
"register-obj" and "delete-obj" are defined in DCM.
On Fri, 2006-08-11 at 17:17 -0400, Daniel Salama wrote:
Hi, This may be more of a suggestion since I think I already know the answer. I come from the Ruby On Rails world and, as some of you may know, their Active Record module provides hooks that allow the automatic and customized evaluation of validation rules at different stages of the committing process. At first, I was going to as how can I hook validation rules into the persistent machinery. I guess I could (should) always wrap my commits in transactions and then I could perform the validation process within the transaction and, therefore, I could commit or abort depending on the validation results. However, as my Lisp knowledge is still limited, I'd like to suggest for some future version of Elephant, the inclusion of some type of macro that works somehow like a with-transaction type operation. This macro could support generic methods that could be "customized" per class just like CLOS generic methods to support model validation. Just for reference, Rails validation hooks support, among others: - before validation - after validation - before create - after create - before save - after save - before destroy - after destroy Maybe some of this functionality could be implemented in the near future. Maybe it's not that big of a deal, but, since my Lisp knowledge is limited, I am just throwing this suggestion. Then again, maybe there is a better way to do it and I just have too much of a Rails mentality for the time being :) Thanks, Daniel _______________________________________________ elephant-devel site list elephant-devel@common-lisp.net http://common-lisp.net/mailman/listinfo/elephant-devel
_______________________________________________ elephant-devel site list elephant-devel@common-lisp.net http://common-lisp.net/mailman/listinfo/elephant-devel