Options merging and destructible things - FLUID-3675
Antranig Basman
antranig.basman at colorado.edu
Fri Jun 18 05:04:23 UTC 2010
Colin and I had a good talk this afternoon which suggested a few ways
out of our current problems with "non-model-contract" items (such as,
for example, ironically, models) being destroyed through being passed
through the options merging process.
Whilst (as it seems with everything) a long-term good solution to this
issue lies with the use of IoC, in the short to medium term it seems we
can get by with the use of a slight tweak to our options merging
algorithm, in the form of a new directive called "preserve" - this
designates a path which holds a "destructible item" such a model,
applier, or other "live piece of that" which rather than being "merged"
will simply be copied directly into the component's options.
http://issues.fluidproject.org/browse/FLUID-3675 is the JIRA created for
this. Initially signed over to Colin but I found myself with what
amounted to most of a test case for part of the functionality and my
head filled with part of the soln, the first part of the solution is now
in trunk. You can consult the new test case in FluidJSTests.js to see
the idea - but it works similarly to the existing directive we had
called "replace".
In order to make this convenient for everyday users of the framework,
this kind of directive (expressed in the component's default options)
needs to be factored away into what in a more unenlightened era might
have been called a "base class". Today, we imagine the use of component
"categories" or "grades" - which express the identity of the
initialisation function used to first construct the "that" in the
creator function. In these terms, we currently just have two "component
grades" - which are "Little Component" and "View Component". In the near
future we expect to have a healthy lattice of these things - which again
in "old-world monkeys" could be termed "mixins" - for example, a
component may be model-bearing, view-bearing, renderer-bearing or any
valid combination of these (clearly view-bearing implies model-bearing,
and renderer-bearing implies both - actually this is starting to look
more like a straight hierarchy ...)
fluid.defaults("fluid.tests.testMergeComponent",
{ mergePolicy: { model: "preserve",
applier: "preserve"}});
It is important in all other cases, that options merging continues to
apply the old semantics of constructing new containers whenever
possible, to avoid aliasing together the various elements of the object
trees that participate in merging. This is important to avoid the really
bad consequences of facilitating people to inadvertently reach into the
actual component defaults record itself, for example, and corrupt it for
all time. We experimented briefly with a "conservative merge" that
copied "source" containers whenever possible, but this already showed
failures within some of the tests for the LayoutReorderer - which were
revealed to be "alias-prone" in that the tests now failed to be
isolated, and execution of some tests could cause subsequent tests to fail.
More information about the fluid-work
mailing list