[Laszlo-dev] Simple idea on how to update dynamic instantiation of user classes

P T Withington ptw at pobox.com
Tue Jul 1 06:06:28 PDT 2008


On 2008-07-01, at 08:32 EDT, Donald Anderson wrote:

>>> -   if the class name is a class defined in the input, then add  
>>> lz. (?)  [requires two passes]
>>
>> Correct.  All LZX classes defined with <class name="foo"... must be  
>> referenced as lz.foo in `new` and `instanceof`.
>
> I'm a little confused.  I thought this script only converted .lzs  
> files.
> It sounds like the script operates on and converts both, but we  
> should only collect the class names
> I see in LZX on the first pass.   ??

Yes the script is for LZX files.  Yes the script should accumulate  
class names in first pass (by looking for <class name="...", probably  
also <interface name="...", just in case).  But you can't just replace  
class names with lz.<name> everywhere.  You should only replace it  
when they are an operand of a `new` or `instanceof` operator.

Why?  Because in the old days, <class name="foo" ... defined both a  
tag 'foo' and a class 'foo'.  Now, we separate those two concepts.

In LZX you can create an instance of an LZX class either by using the  
tag in declarative code:

   <foo />

_or_ by using `new` and the class in script:

   <method ...>
     new ¿foo? ;
   </method>

You used to say `new foo`, but now the actual class is (effectively)  
in a private namespace, so that it won't clutter up the global  
namespace.  Instead, we build a mapping from tag name to class, so  
that you can get at the class that implements a tag by saying  
`lz['foo']` (which for a constant tag can be abbreviated `lz.foo`).

But!

A common idiom in components was to say:

   <class name="complex">
     <attribute name="subviewClass" type="String" />
     <method ...>
       new global[subviewClass](...);
     </method>

In this case, `subviewClass` _really_ meant subviewTag.  The user  
would pass the tag name (as a string) for the type of subview they  
wanted.  So you would invoke it:

   <complex subviewClass="text" />

In the new world, all you want to do is change `global` to `lz`.  You  
don't want to change `text` to `lz.text`.





More information about the Laszlo-dev mailing list