Here is a more concise proposal:
The `id` property of a node will only cause a global binding in LZX.
To achieve the same effect in JS, you must make the binding yourself:
var <idname> = new <node subclass>(<parent>, {id: <idname>, ...});
The `name` property of a node will only cause a global binding in LZX
if that node is a lexical (not placed) child of the canvas.
I have implemented these changes, and lztest and smokecheck pass.
Still sorting runlzunit. Seems like <command> is doing something
funky with id's...
On 2008-04-10, at 06:09 EDT, P T Withington wrote:
On 2008-04-10, at 03:28 EDT, André Bargull wrote:
`lzAddLocalData` is _not_ used for local datasets, it is used for
top-level datasets, see "DataCompiler.java". So that's a compile
time issue, which shouldn't be a problem even in swf9.
So just a convention, which we could change, and still be
transparent to the LZX user.
I've observed in the past that datasets seem to get defined in 3
places: globally, on the canvas, and in canvas.datasets. This would
seem like overkill. Perhaps we could limit them to being defined in
just two places, or maybe even one?
These two constructs no longer work to create a global object:
new <lznode subclass>(canvas, {name: 'foo'});
new <lznode subclass>(canvas, {id: 'foo'});
That's what I am proposing. The replacement would be:
[At the top level of your program]
var foo;
[Anywhere else in your program where `foo` is lexically apparent]
foo = new <lznode subclass>(canvas, ...);
This is not a full replacement, since the foo object will not know
what global it had been bound to.
Hm, would it make sense to integrate "as3 global-support" like this
"http://www.uza.lt/codex/as3-global-object/"? That way you can
create code which works in all runtimes,
provided that everyone uses "global.foo" to access a global object.
We already have that in a sense. Any top-level object will be a
child of the canvas, so named objects on the canvas are always
accessible as `canvas.<name>`. We could say that an object with an
id similarly becomes accessible through the canvas as `canvas.<id>`.
The plus of going this way is there would be no collisions with
runtime globals. The minus would be that everyone would need to be
re-trained to qualify their free references. That would probably
not be acceptable...
What I am proposing is just a restriction on JS dynamic creation of
nodes. At the LZX level, we already state that node `name` and `id`
properties are final. I'm proposing a restriction that at the JS
level, they are not properties of node at all; that if you want your
node to be a global value or a property, you do it yourself.
On 4/10/2008 2:11 AM, P T Withington wrote:
Because I can't see how to implement that at runtime in swf9.
Currently, if I say:
new <lznode subclass>(canvas, {name: foo});
the global `foo` will be bound to my instance. In particular,
this idiom is currently used by `lzAddLocalData` and
`lzpreloader`. Do local datasets really need to be stored as
globals? This seems like namespace pollution to me. We can't do
this in swf9 because swf9 does not let you dynamically add global
names.
I would like to remove support for a top-level name acting as an
id. In fact, our documentation says that both `name` and `id` are
final, which would indicate to me that you should not be able to
supply them at run time at all. IWBRN to remove this wart.