From an e-mail to the Openinteract Dev list ... To: Chris Winters , OpenInteract Dev List From: Ray Zimmerman Subject: [Openinteract-dev] SPOPS enhanced HAS-A semantics (changes to proposal) Date: Fri, 4 Jan 2002 16:59:40 -0500 Chris, I realized the other day that the enhanced has-a semantics I proposed in an e-mail to the list back on 7/3/01 is not quite general enough for all of our needs. (I've included the entire original proposal at the end of this e-mail for reference). The issue is that I assumed that any secondary objects auto-fetched (or lazy-fetched) with the primary object should always be auto-saved with that object as well. Based on this assumption, I did not include any explicit 'save' configuration in the new has-a syntax. The 3 rules for saving were ... ---------- (I'm pulling this text directly out of the original write-up, where $x belongs to class X which has-a field named 'myA' which is an object of type A, and a field named 'myB' which is an object of type B) ... 1. In all forward direction fetch configurations (manual, auto and lazy), if $x->{myA} contains a reference to an A object when $x is saved, it will save the A object during the pre_save stage before saving $x with the updated id of the A object. If $x->{myA} contains an id only, nothing special is done when $x is saved. 2. In all reverse direction fetch configurations (manual_by, auto_by and lazy_by), if $a->{'list_of_Xs'} contains an arrayref of X objects when $a is saved, it will save each X during the post_save stage after updating the myA field in each X with the new id of $a. 3. For all links (manual, auto and lazy), whether or not $a->{'linked_Bs'} contains anything when $a is saved, it will NOT automatically save any X's or B's. ---------- I've run across some cases where that isn't the desired behavior. In particular, sometimes one may not want to auto-save the secondary objects even though they are being auto/lazy-fetched. This could be the case for either forward or backward direction fetch configurations. On the other hand, one may want to allow auto-saving of linked secondary objects (not allowed by 3 above). My new proposal is to let the old proposal define the default behavior, but add an optional parameter to the 'fetch' and 'link' parts of the configuration. In the 'fetch' configuration allow an optional 'no_save' parameter with values 0 or 1, where 0 corresponds to the default behavior (saving all secondary objects) and 1 specifies that it should not do any saving of secondary objects. In the 'link' configuration, allow an optional 'save' parameter with values 0 or 1, where 0 specifies the default (don't auto-save anything) and 1 means to save any linked objects, if necessary creating the corresponding linking objects. There are more details to be worked out with this, but I thought I'd better send you what I have at the moment, before I get pulled off to other things. Ray