Hi Marco,
Though I'm happy to do baseline maintenance and merging of patches for the project, I don't have a lot of time to invest in it. And sweeping changes would need extremely careful review, and would no doubt cause further issues for other people. So I have to say no, in my distribution, we're down to minimal, super-conservative maintenance. Feel free to start a fork.
Best, Marijn
On Thu, Jan 30, 2014 at 12:33 AM, Marco Baringer mb@bese.it wrote:
i'd like to replace build-dao-methods with a set of slots on the dao-class instance, a common root in the class hierarchy (which would be dao-object) and a set of methods specialized on dao-object. before i do the work i want to make sure the patch won't be rejected on principle.
my main problem with build-dao-methods is that it generates a new, distinct, method on the generic functions for every dao-class instance. when you have a lot of dao-class instances it becomes difficult to figure out which methods are auto generated and which are 'real' and may do something different than the standard methods (and implementing these non standard methods requires rewriting a lot of the code in build-dao-methods since call-next-method doesn't actually do anything).
another problem, though i haven't actually had this problem in practice, is that build-dao-methods defines shared-initialize :after method on the given class to call fetch-defaults; this makes it impossible for me to define my own shared-initialize :after method to perform whatever extra initialization i may have. i can imagine a work around to this issue by defining the dao-class and then subclassing it to get the actual functionality i need, or call fetch-defaults myself, but being able to just define an :after method and have things Just Work(TM) seems simpler.
there are a few things the build-dao-methods does that, i think, i can maintain using just the plain old mop:
only defining update-dao and upsert-dao when the class has value fields. by inspecting the class at compute-class-precedence-list time we can inject either dao-value-object or dao-key-only-object and then define the update/upsert-dao methods on dao-value-object and not dao-key-only-object.
fwiw i think these methods should be defined for all dao objects; just because all the slots of the object are its primary key doesn't mean that changing one of those slots doesn't make sense (this can happen in practice when working with relation tables whose columns are all foreign keys and to preserve uniqueness of the relation the primary key consists of all (usually 2) columns).
the methods defined by build-dao-methods close over a set of precomputed values (column names and sql templates). by storing these values in the class instance directly we still avoid recomputing them every time the method is called and gain the ability to, easily, inspect their values at run time for debugging purposes.
the one thing build-dao-methods does that i can't maintain is the lack of a common root class for all dao-class instances (in order for the various update/get/upsert/insert dao methods to get called there will need to be a dao-object in the hierarchy somewhere). the dao-object class can be injected in dao-class instance's precedence-list via compute-class-precedence-list, so there wouldn't be any changes required to user code; i don't really see this as an issue.
i would also need to add in a dependency on closer-mop. i could imagine just cut 'n pasting the, relatively limited, parts of closer-mop we'd actually be using, and that would keep postmodern's dependencies to what they are today, but that seems like a bad thing to do.
since this is a substantial change to how the dao methods are created i'd like to make sure that there aren't any objects to it (philosophical or technical) before actually making the change and submitting the pull request.
thanks,
-marco