From frgo at me.com Sun Oct 12 21:01:30 2008 From: frgo at me.com (Frank Goenninger) Date: Sun, 12 Oct 2008 23:01:30 +0200 Subject: [cells-devel] Cells: File test-cc.lisp missing in CVS Message-ID: <3EA8094A-A35C-42B7-B2CE-38B3EFAD938C@me.com> Hi Kenny, just noticed your latest commits to CVS for Cells. I dl'ed it and found that both in cells.asd and cells.lpr the file test-cc.lisp is mentioned but missing in the repository. Could you please add this? Thanks! Best, Frank -------------- next part -------------- A non-text attachment was scrubbed... Name: PGP.sig Type: application/pgp-signature Size: 859 bytes Desc: not available URL: From kennytilton at optonline.net Sun Oct 12 21:23:07 2008 From: kennytilton at optonline.net (Kenny Tilton) Date: Sun, 12 Oct 2008 17:23:07 -0400 Subject: [cells-devel] Cells: File test-cc.lisp missing in CVS In-Reply-To: <3EA8094A-A35C-42B7-B2CE-38B3EFAD938C@me.com> References: <3EA8094A-A35C-42B7-B2CE-38B3EFAD938C@me.com> Message-ID: <48F26ABB.6020507@optonline.net> Frank Goenninger wrote: > Hi Kenny, > > just noticed your latest commits to CVS for Cells. I dl'ed it and found > that both in cells.asd and cells.lpr the file test-cc.lisp is mentioned > but missing in the repository. > > Could you please add this? Done. Let me know if you can figure out what it is testing! :) kt -- http://www.theoryyalgebra.com/ From frgo at me.com Mon Oct 13 17:52:33 2008 From: frgo at me.com (Frank Goenninger) Date: Mon, 13 Oct 2008 19:52:33 +0200 Subject: [cells-devel] Cells: File test-cc.lisp missing in CVS In-Reply-To: <48F26ABB.6020507@optonline.net> References: <3EA8094A-A35C-42B7-B2CE-38B3EFAD938C@me.com> <48F26ABB.6020507@optonline.net> Message-ID: <997FC00B-AC61-4DD4-9EA2-A35646DF2347@me.com> Am 12.10.2008 um 23:23 schrieb Kenny Tilton: > Frank Goenninger wrote: >> Hi Kenny, >> just noticed your latest commits to CVS for Cells. I dl'ed it and >> found that both in cells.asd and cells.lpr the file test-cc.lisp >> is mentioned but missing in the repository. >> Could you please add this? > > Done. Let me know if you can figure out what it is testing! :) Well, I do think it "simply" tests the correct order of execution of changes to a slot when an observer changes a slot that the observer observes. As a by-product it tests the finish business queueing mechanism and the overall integrity machinery. No? ;-) Frank -------------- next part -------------- A non-text attachment was scrubbed... Name: PGP.sig Type: application/pgp-signature Size: 859 bytes Desc: not available URL: From kennytilton at optonline.net Mon Oct 13 18:26:18 2008 From: kennytilton at optonline.net (Kenny Tilton) Date: Mon, 13 Oct 2008 14:26:18 -0400 Subject: [cells-devel] Cells: File test-cc.lisp missing in CVS In-Reply-To: <997FC00B-AC61-4DD4-9EA2-A35646DF2347@me.com> References: <3EA8094A-A35C-42B7-B2CE-38B3EFAD938C@me.com> <48F26ABB.6020507@optonline.net> <997FC00B-AC61-4DD4-9EA2-A35646DF2347@me.com> Message-ID: <48F392CA.7090407@optonline.net> Frank Goenninger wrote: > > Am 12.10.2008 um 23:23 schrieb Kenny Tilton: > >> Frank Goenninger wrote: >> >>> Hi Kenny, >>> just noticed your latest commits to CVS for Cells. I dl'ed it and >>> found that both in cells.asd and cells.lpr the file test-cc.lisp is >>> mentioned but missing in the repository. >>> Could you please add this? >> >> >> Done. Let me know if you can figure out what it is testing! :) > > > Well, I do think it "simply" tests the correct order of execution of > changes to a slot when an observer changes a slot that the observer > observes. As a by-product it tests the finish business queueing > mechanism and the overall integrity machinery. > > No? > > ;-) > Ah, yes. I have gotten quite nasty about doing things inside observers, including making changes and then wanting to do have the change visible for more work in the observer. Since changes get deferred this gets hairy fast (esp. since I discovered that there is a double deferral! The deferred thing gets dispatched and since it is a setf (perhaps buggily, I have not thought it thru) immediately goes to the end of the queue). This is normally benign but with what I was doing it got nuts fast. We may need a Cells5 soon. (Thomas forked and called it C4, I better skip 4). cheers, ken From kentilton at gmail.com Tue Oct 14 23:43:20 2008 From: kentilton at gmail.com (Kenny) Date: Tue, 14 Oct 2008 19:43:20 -0400 Subject: [cells-devel] Pentagon of Death [was Re: Vancouver Lisp Users Group meeting for October 2008 - The Nature of Order] In-Reply-To: <1706143f-2d81-4e74-a3a3-ea08ec86fa1c@i18g2000prf.googlegroups.com> References: <48e3f6a7$0$4903$607ed4bc@cv.net> <5fee9c0e-e189-444a-a02c-3feee53429e2@75g2000hso.googlegroups.com> <48e4ffe9$0$4912$607ed4bc@cv.net> <6km4j4F8io2tU1@mid.individual.net> <48e62d4c$0$4986$607ed4bc@cv.net> <48e66a59$0$5665$607ed4bc@cv.net> <48e7c7c0$0$4987$607ed4bc@cv.net> <48e7e7db$0$5667$607ed4bc@cv.net> <1706143f-2d81-4e74-a3a3-ea08ec86fa1c@i18g2000prf.googlegroups.com> Message-ID: <48F52E98.7050803@gmail.com> puchacz wrote: > On Oct 4, 11:03 pm, Kenny wrote: > >>Patrick May wrote: >> >>>Kenny writes: >> >>>>Patrick May wrote: >> >>>>>Kenny writes: >> >>>>>>I wonder if Flash can keep up with compiled JS. You don't mind the >>>>>>Flash requirement? I realize it is ubiquitous enough, but still. >> >>>>> It loads relatively slowly, but once it's loaded it's as fast >>>>>as a desktop app (not surprisingly). I selected it despite the >>>>>Flash requirement because it provided a nice grid control and the >>>>>chart displays I needed. >> >>>>JS frameworks don't have those? >> >>> Some have one, some have the others, some have some other bits I >>>wanted to use. TIBCO's GI was actually my first choice, but there was >>>a bug in Safari that prevented me from using it. >> >>I was just going to say one big win would be insulation from browser >>variability. >> >> >> >> >>>>Or was it more like you had zero reason to avoid Flash (and maybe >>>>already knew it) so there was no reason to hassle with less polished >>>>tools? I suppose you also had the means to acquire the tools. >> >>> Actually, I felt rather dirty using Flash. And not in that good, >>>tingly way. >> >>:) >> >> >> >> >>> Aside from the chart widgets, the tools are free (as in beer). >> >>What's your IDE, Eclipse? >> >> >> >> >>>[ . . . ] >> >>>>No Cells? Are you mad? For a GUI? Celtk and Cells-Gtk (and soon >>>>Xello) will show you how to drive an existing framework with Cells. >> >>> This application is a trading system. If Cells is fast enough, >>>it might be a good choice for the backend. Can I get a response in 10 >>>milliseconds when an order book changes? >> >>10ms is an eternity! I know, I have a feel for that having done >>RoboCells in which we handled realtime inputs spaced at 100ms. >> >>Otherwise, not sure what you are asking. Naturally a very interesting >>question is how long does the functional computation take. But I will >>presume that is in order and what you are asking is if Cells is a pig. >>No. (see "RoboCells"). In fact, Cells helps a bit by magically >>discerning exactly what needs to be updated when X changes. I tried to >>tell the walking dead at ECLM 2008 that Cells is a library about change. >> Practically, this means one has complete control over change, >>including the aforementioned optimization of changing only those things >>that need to change, but also being able to surgically control "oh, I do >>not need to update /that/ every 10ms, I can do it every other unless of >>courese Y changes by 42%". Stuff like that. >> >>Well, if js/html/css get on my nerves I'll take a look at Fex/MXML. Thx >>for the lead. >> >>kt > > > Hi, > > Is Cells able to handle updates in a "diamond scenario"? > > "a": external input > "b": driven from "a" > "c": driven from "a" > "d": driven from "b" and "c" > > As "d" is driven indirectly from a single input "a", and processing of > "b" and "c" may take different time, it is important to wait with > updating of "d" until both "b" and "c" is finished. Otherwise, "d" may > publish its value twice, and the first value would be totally > incorrect, like a huge spike in the series. PWUAHAHAHAHAHHAHAA! I thought I invented that. Philip Eby gave it a more dramatic name when I explained it to him while justifying the Cells mechanism -- the Pentagon of Death, I think it was. Why Pentagon aka 5? I settled on a tougher case in which, eg, d did not depend directly on c, but did so indirectly thru an intermediary depencency c2 which depended on c. Why does this matter? If a changes c needs to be recalculated, period, no question. But C might recompute and come up with the same value, say if A changes from 3 to 6 and C is (mod A 3). In that case we cannot know C2 is obsolete until C runs, and this defeats some algorithms (assuming we have a rule that says "never calculate unecessarily"). I also made it nastier in that...well, it gets complicated, but Cells tracks dynamic dependencies, not lexical, so I cannot just inspect the dependency graph as it stands -- the change to 'a' might make 'd' go after 'c2' for the first time ever in 'd's life. Philip struggled mightily to find a better way than the Cells algorithm, but in the end the Pentagon of Death beat every alternative. Thx for the heads up on the prior art. cheers,ken From frgo at me.com Thu Oct 23 11:55:46 2008 From: frgo at me.com (Frank Goenninger) Date: Thu, 23 Oct 2008 13:55:46 +0200 Subject: [cells-devel] Family Registry ? What for ? Message-ID: <76AB44FA-502C-49CF-8A3B-955428C6E0DC@me.com> While inspecting a model I saw the registry? slot - but no registry being assigned ... Which lead to an assertion failure afterwards. So: What for is the registry mechanism? Different families ? Thx for info. Cheers Frank -------------- next part -------------- A non-text attachment was scrubbed... Name: PGP.sig Type: application/pgp-signature Size: 859 bytes Desc: not available URL: From kennytilton at optonline.net Thu Oct 23 12:38:09 2008 From: kennytilton at optonline.net (Kenny Tilton) Date: Thu, 23 Oct 2008 08:38:09 -0400 Subject: [cells-devel] Family Registry ? What for ? In-Reply-To: <76AB44FA-502C-49CF-8A3B-955428C6E0DC@me.com> References: <76AB44FA-502C-49CF-8A3B-955428C6E0DC@me.com> Message-ID: <49007031.5010105@optonline.net> Frank Goenninger wrote: > While inspecting a model I saw the registry? slot - but no registry > being assigned ... I have this in my family.lisp: (defmethod initialize-instance :after ((self family) &key) (when (registry? self) (setf (registry self) (make-hash-table :test 'eq)))) No? > Which lead to an assertion failure afterwards. Where exactly? > So: > What for is the registry mechanism? Actually Peter H rolled something similar doing his project and I had been fighting thru a lot of issues where one instance was looking for another by name and it got tricky because everyone was coming into or going out of existence and did not exist yet or any longer and I decided to see if simply registering a name-model pair in a hash table right at initialize-instance time (vs md-awaken even) would work better than fm-other which navigates the family tree to find things. It does help, but I do not use it for normal lookups, just the ones that do not play well with the normal scheme. cheers, ken From frgo at me.com Thu Oct 30 12:15:41 2008 From: frgo at me.com (Frank Goenninger) Date: Thu, 30 Oct 2008 13:15:41 +0100 Subject: [cells-devel] Cells: Controlling the way kids are added to a parent ... Message-ID: Hi - I want to control if a kid is added to a parent based on the execution of a check function. The check function is supposed to throw an condition when the check fails. Current use case: Control which classes of kids are added to a parent. I do have a model of class BOM (bill of material) that only can accept classes Assembly and Part as kids. I found two places at which I could insert a call to the check function: function fm-kid-add (higher level interface) function fm-kid-insert (lower level interface) Question now is: Why would one be better than the other? Idea here is based on adding a new slot to class family: (defmodel family (model) ((.kid-slots :cell nil :initform nil :accessor kid-slots :initarg :kid-slots) (.kids :initform (c-in nil) ;; most useful :owning t :accessor kids :initarg :kids) (registry? :cell nil :initform nil :initarg :registry? :accessor registry?) (registry :cell nil :initform nil :accessor registry) ;; added: frgo, 2008-10-30 ----- (kid-add-control-hook :cell nil :initform nil :initarg: kid-add-control-hook))) and then do run the check functions that have been added to the control hook (= list of functions to be funcalled). Right approach? Any comments? (It works but I'd like to know if am on the right track). Thanks for feedback. Cheers Frank -------------- next part -------------- A non-text attachment was scrubbed... Name: PGP.sig Type: application/pgp-signature Size: 859 bytes Desc: not available URL: From kennytilton at optonline.net Thu Oct 30 16:07:32 2008 From: kennytilton at optonline.net (Kenny Tilton) Date: Thu, 30 Oct 2008 12:07:32 -0400 Subject: [cells-devel] Cells: Controlling the way kids are added to a parent ... In-Reply-To: References: Message-ID: <4909DBC4.1080504@optonline.net> Frank Goenninger wrote: > Hi - > > I want to control if a kid is added to a parent based on the execution > of a check function. The check function is supposed to throw an > condition when the check fails. > > Current use case: > > Control which classes of kids are added to a parent. I do have a model > of class BOM (bill of material) that only can accept classes Assembly > and Part as kids. > > I found two places at which I could insert a call to the check function: > > function fm-kid-add (higher level interface) > function fm-kid-insert (lower level interface) > > Question now is: Why would one be better than the other? > > Idea here is based on adding a new slot to class family: > > (defmodel family (model) > ((.kid-slots :cell nil > :initform nil > :accessor kid-slots > :initarg :kid-slots) > (.kids :initform (c-in nil) ;; most useful > :owning t > :accessor kids > :initarg :kids) > (registry? :cell nil > :initform nil > :initarg :registry? > :accessor registry?) > (registry :cell nil > :initform nil > :accessor registry) > ;; added: frgo, 2008-10-30 ----- > (kid-add-control-hook :cell nil > :initform nil > :initarg: kid-add-control-hook))) > > and then do run the check functions that have been added to the control > hook (= list of functions to be funcalled). > > Right approach? Any comments? (It works but I'd like to know if am on > the right track). > > Thanks for feedback. My purely engineer's reaction is that (setf .kids) is the official gateway to that slot. I actually forgot about those "fm" functions. Of course if /you/ are consistent in their use you should be OK, but how about an :around method on (setf .kids) where you check before calling call-next-method to complete the operation? If you need it to work for kids computed by rules, that might have to be (setf cells::md-slot-value) further specialized with (slot-name (eql '.kids)), but I guess we are not talking about this since you are thinking the "fm" functions are a possible solution. hth, kenny From frgo at me.com Thu Oct 30 21:05:18 2008 From: frgo at me.com (Frank Goenninger) Date: Thu, 30 Oct 2008 22:05:18 +0100 Subject: [cells-devel] Cells: Controlling the way kids are added to a parent ... In-Reply-To: References: Message-ID: <29976C1C-2592-48C8-8460-CD4A140D92E7@me.com> ... and again a question related to this: Suppose I have : (defmd kid-test-2 (family) (a-slot (c-in nil)) :kids (list (make-instance 'my-kid) (make-instance 'my-kid))) Now - this completely bypasses the control mechanism inserted into fm- kid-add - which is not what I wanted ;-) So, I am asking myself if it would be better to insert the check into the .kids observer ... I now have: (defmodel family (model) ((.kid-slots :cell nil :initform nil :accessor kid-slots :initarg :kid-slots) (.kids :initform (c-in nil) ;; most useful :owning t :accessor kids :initarg :kids) (registry? :cell nil :initform nil :initarg :registry? :accessor registry?) (registry :cell nil :initform nil :accessor registry) ;; added: frgo, 2008-10-30 (control-hooks :cell nil :accessor control-hooks :initform (make-hash-table :test 'eql) :initarg :control-hooks))) (defmethod get-control-hooks ((self family) hook-id) (gethash hook-id (control-hooks self))) (defmethod add-hook ((self family) id hook) (setf (gethash id (control-hooks self)) hook)) (defun call-control-hook (hook self &rest args) ;;; to be completed here ) (eval-when (:compile-time :load-toplevel) (proclaim '(inline mklist)) (if (not (fboundp 'mklist)) (defun mklist (obj) (if (listp obj) obj (list obj))))) (defun run-control-hooks (id self &rest args) (c-assert (typep self 'family)) (let ((hooks (get-control-hooks self id))) (if hooks (loop for hook in (get-control-hooks self id) collect (call-control-hook hook self args) into result finally (return (mklist result))) (mklist t)))) and (define-condition cells-adding-kid-not-allowed-error (error) ((text :initarg :text :reader text))) (defun kid-add-allowed? (fm-parent kid) (notany #'null (run-control-hooks 'fm-kid-add-control fm-parent kid))) (defun fm-kid-add (fm-parent kid &optional before) (c-assert (or (null (fm-parent kid)) (eql fm-parent (fm-parent kid)))) (c-assert (typep fm-parent 'family)) ;; Added: frgo, 2008-10-30 (if (kid-add-allowed? fm-parent kid) (progn ;; (trc "Adding kid to parent" kid fm-parent) (setf (fm-parent kid) fm-parent) (fm-kid-insert kid before)) (error 'cells-adding-kid-not-allowed-error :text (format nil "ERROR: Kid ~s not allowed for parent ~s." kid fm-parent)))) - which is incomplete, of course, but shows the basic idea, or so I hope. Any thoughts if I should use the observer or do some clever slot trickery using MOP ? Thanks for feedback! Regards Frank Am 30.10.2008 um 13:15 schrieb Frank Goenninger: > * PGP Signed: 10/30/08 at 13:15:51 > > Hi - > > I want to control if a kid is added to a parent based on the > execution of a check function. The check function is supposed to > throw an condition when the check fails. > > Current use case: > > Control which classes of kids are added to a parent. I do have a > model of class BOM (bill of material) that only can accept classes > Assembly and Part as kids. > > I found two places at which I could insert a call to the check > function: > > function fm-kid-add (higher level interface) > function fm-kid-insert (lower level interface) > > Question now is: Why would one be better than the other? > > Idea here is based on adding a new slot to class family: > > (defmodel family (model) > ((.kid-slots :cell nil > :initform nil > :accessor kid-slots > :initarg :kid-slots) > (.kids :initform (c-in nil) ;; most useful > :owning t > :accessor kids > :initarg :kids) > (registry? :cell nil > :initform nil > :initarg :registry? > :accessor registry?) > (registry :cell nil > :initform nil > :accessor registry) > ;; added: frgo, 2008-10-30 ----- > (kid-add-control-hook :cell nil > :initform nil > :initarg: kid-add-control-hook))) > > and then do run the check functions that have been added to the > control hook (= list of functions to be funcalled). > > Right approach? Any comments? (It works but I'd like to know if am > on the right track). > > Thanks for feedback. > > Cheers > Frank > > > > > > * Frank Goenninger > * 0xE6BDA9B9:0x6AEA9601 > _______________________________________________ > cells-devel site list > cells-devel at common-lisp.net > http://common-lisp.net/mailman/listinfo/cells-devel > > > * PGP Signed: 10/30/08 at 13:15:51 > * text/plain body > * Frank Goenninger > * 0xE6BDA9B9:0x6AEA9601 -------------- next part -------------- A non-text attachment was scrubbed... Name: PGP.sig Type: application/pgp-signature Size: 859 bytes Desc: not available URL: From kennytilton at optonline.net Thu Oct 30 23:16:13 2008 From: kennytilton at optonline.net (Kenny Tilton) Date: Thu, 30 Oct 2008 19:16:13 -0400 Subject: [cells-devel] Cells: Controlling the way kids are added to a parent ... In-Reply-To: <29976C1C-2592-48C8-8460-CD4A140D92E7@me.com> References: <29976C1C-2592-48C8-8460-CD4A140D92E7@me.com> Message-ID: <490A403D.603@optonline.net> [hmmm... did you get my other response? This is a diff question, but you did not mention my other so I am concenred.] Frank Goenninger wrote: > ... and again a question related to this: > > Suppose I have : > > (defmd kid-test-2 (family) > (a-slot (c-in nil)) > :kids (list (make-instance 'my-kid) > (make-instance 'my-kid))) > > Now - this completely bypasses the control mechanism inserted into fm- > kid-add - which is not what I wanted ;-) Good point, another hole. In ACL and any CL supporting a full MOP, btw, you can supply an around method to (setf slot-value-using-class) which is the implementation of (setf slot-value) and /really/ control access. Anyway... > So, I am asking myself if it would be better to insert the check into > the .kids observer ... One big concern I have is, is this too late? Do you have any requirement to stop these sooner? ie, If you want to signal a condition that is fine, but recovering from it means also backing out the change and /that/ would be a lot of work at the late stage when the observer gets called. > > I now have: > > (defmodel family (model) > ((.kid-slots :cell nil > :initform nil > :accessor kid-slots > :initarg :kid-slots) > (.kids :initform (c-in nil) ;; most useful > :owning t > :accessor kids > :initarg :kids) > (registry? :cell nil > :initform nil > :initarg :registry? > :accessor registry?) > (registry :cell nil > :initform nil > :accessor registry) > ;; added: frgo, 2008-10-30 > (control-hooks :cell nil > :accessor control-hooks > :initform (make-hash-table :test 'eql) > :initarg :control-hooks))) > > (defmethod get-control-hooks ((self family) hook-id) > (gethash hook-id (control-hooks self))) > > (defmethod add-hook ((self family) id hook) > (setf (gethash id (control-hooks self)) hook)) > > (defun call-control-hook (hook self &rest args) > ;;; to be completed here > ) > > (eval-when (:compile-time :load-toplevel) > (proclaim '(inline mklist)) > (if (not (fboundp 'mklist)) > (defun mklist (obj) > (if (listp obj) > obj > (list obj))))) > > (defun run-control-hooks (id self &rest args) > (c-assert (typep self 'family)) > (let ((hooks (get-control-hooks self id))) > (if hooks > (loop for hook in (get-control-hooks self id) > collect (call-control-hook hook self args) > into result > finally (return (mklist result))) > (mklist t)))) > > and > > (define-condition cells-adding-kid-not-allowed-error (error) > ((text :initarg :text :reader text))) > > (defun kid-add-allowed? (fm-parent kid) > (notany #'null (run-control-hooks 'fm-kid-add-control fm-parent kid))) > > (defun fm-kid-add (fm-parent kid &optional before) > (c-assert (or (null (fm-parent kid)) (eql fm-parent (fm-parent kid)))) > (c-assert (typep fm-parent 'family)) > ;; Added: frgo, 2008-10-30 > (if (kid-add-allowed? fm-parent kid) > (progn > ;; (trc "Adding kid to parent" kid fm-parent) > (setf (fm-parent kid) fm-parent) > (fm-kid-insert kid before)) > (error 'cells-adding-kid-not-allowed-error > :text (format nil > "ERROR: Kid ~s not allowed for parent ~s." > kid fm-parent)))) > > - which is incomplete, of course, but shows the basic idea, or so I hope. > > Any thoughts if I should use the observer or do some clever slot > trickery using MOP ? Ah, you were way ahead of me. The observer might be too late if you want this to be recoverable. kt From frgo at me.com Fri Oct 31 16:22:16 2008 From: frgo at me.com (Frank Goenninger) Date: Fri, 31 Oct 2008 17:22:16 +0100 Subject: [cells-devel] Cells: Controlling the way kids are added to a parent ... In-Reply-To: <490A403D.603@optonline.net> References: <29976C1C-2592-48C8-8460-CD4A140D92E7@me.com> <490A403D.603@optonline.net> Message-ID: <92ABAAA7-C05D-4B80-8A43-948AA9B50845@me.com> Am 31.10.2008 um 00:16 schrieb Kenny Tilton: > [hmmm... did you get my other response? This is a diff question, but > you did not mention my other so I am concenred.] No, I actually didn't. > Frank Goenninger wrote: >> ... and again a question related to this: >> Suppose I have : >> (defmd kid-test-2 (family) >> (a-slot (c-in nil)) >> :kids (list (make-instance 'my-kid) >> (make-instance 'my-kid))) >> Now - this completely bypasses the control mechanism inserted into >> fm- kid-add - which is not what I wanted ;-) > > Good point, another hole. In ACL and any CL supporting a full MOP, > btw, you can supply an around method to (setf slot-value-using- > class) which is the implementation of (setf slot-value) and /really/ > control access. Anyway... > >> So, I am asking myself if it would be better to insert the check >> into the .kids observer ... > > One big concern I have is, is this too late? Do you have any > requirement to stop these sooner? ie, If you want to signal a > condition that is fine, but recovering from it means also backing > out the change and /that/ would be a lot of work at the late stage > when the observer gets called. Ok. Understood. I will try the s-v-u-c approach ... Thanks! Regards, Frank -------------- next part -------------- A non-text attachment was scrubbed... Name: PGP.sig Type: application/pgp-signature Size: 859 bytes Desc: not available URL: