[Laszlo-dev] Proposal to revert behavior of LzNode.construct to 4.1 behavior
André Bargull
andre.bargull at udo.edu
Mon Nov 24 10:36:33 PST 2008
Would this work?
1) Extract all constraint from the "iargs"-object
2) Store all constraints as '$constraints', in case anybody needs to
access them
3) call construct()
4) update constraints, in case user-construct() overrode an initial
constraint
> var constraints:Object = {};
> for (var a:String in iargs) {
> var arg:* = iargs[a];
> if (arg is LzInitExpr) {
> constraints[a] = arg;
> delete iargs[a];
> }
> }
> // save as a special attribute, so we can process
> // constraints more efficient in __LZapplyArgs()
> iargs['$constraints'] = constraints;
>
> this.construct( parent , iargs );
>
> for (var a:String in constraints) {
> if (a in iargs) {
> // user construct() overrode constraint
> delete constraints[a];
> }
> }
On 11/24/2008 7:23 PM, André Bargull wrote:
>> 2) It is possible some construct override manipulates init args
>> expecting to affect how they will be processed by LzNode/__applyArgs
>> (likely, but horrible, and deserves to break).
>
> Do you want to restrict the "args" argument of "construct()" to be
> read-only? Because that won't work, e.g. see LzView, LzText, LzCanvas,
> LzReplicationManager, ...
>
>
>
>
> On 11/24/2008 6:57 PM, P T Withington wrote:
>> I'm working on http://jira.openlaszlo.org/jira/browse/LPP-7378 and
>> see that there are many places where we have failed to check for an
>> 'init arg' having a non-constant initial value (it's value being an
>> instance of LzInitExpr). This has led to any number of bugs, which
>> have been quashed by inserting /ad hoc/ checks throughout custom
>> construct methods (and may have even leaked out to components,
>> possibly even user code).
>>
>> In previous versions (prior to 4.1), non-constant initial values were
>> passed in a separate list, so LzNode/construct overrides never saw
>> these non-constant values. I merged these (multiple) lists, so that
>> the overriding of init args would be correct in subclasses and
>> instances (this solved a number of bugs with trying to override a
>> constraint with a constant value or vice-versa, which was impossible
>> to get correct when the two were inherited by separate chains).
>>
>> But, I think passing these non-constant values to LzNode/construct
>> was a mistake. There is _nothing_ that a construct method can do
>> with these arguments, since they are internal to the LzNode
>> protocol. Since these overrides never saw these values in the past,
>> I don't believe anything can break by removing them from the
>> arguments passed to construct.
>>
>> PROPOSAL: The argument list to LzNode/construct will be a _copy_ of
>> the 'init args' passed to the constructor, with all non-constant
>> arguments removed.
>>
>> PRO:
>>
>> 1) Backward compatible
>> 2) Obviates exposing internal API's
>> 3) Simplifies processing of init args in LzNode/construct overrides.
>>
>> CON:
>>
>> 1) It is possible some construct override depends on knowing that an
>> argument will be constrained (unlikely)
>> 2) It is possible some construct override manipulates init args
>> expecting to affect how they will be processed by LzNode/__applyArgs
>> (likely, but horrible, and deserves to break).
>>
>> Comments?
>>
>> [Filed as http://jira.openlaszlo.org/jira/browse/LPP-7386, Please
>> enter your comments there.]
>>
>
>
More information about the Laszlo-dev
mailing list