[Laszlo-dev] Adding "ignore" arguments....
André Bargull
a.bargull at intensis.de
Sat May 3 16:33:00 PDT 2008
Indeed, I was talking about case 3.
There is still another problem, beside tying a method directly to an
event, there are at least two places where you're indirectly tying it to
an event-like structure: LzTimer and LzIdle. (see "LzTimer#addTimer(..)"
and "LzIdle#removeCallIdleDelegates(..)" resp. "LzIdleKernel.__update()".)
So, what we actually need to do, is to change the LzDelegate-API.
New rule: every method for a delegate must accept at least one argument,
(also see "LzDelegate#execute(..)", so that's definitely necessary.)
What to do: move the argument-length checking from
"LzDelegate#register(..)" to the LzDelegate-constructor.
And as you said, the route 3a should be clearly discouraged, for
instance the public API for "LzDataset#doRequest()" or "LzState#apply()"
has been changed to get around swf9 warnings. A good example for what we
should do, is "LzLazyReplicationManager#__LZhandleUpdate(..)". This
method was added to be compatible to the event-system.
However, we really want to force people to update all their
applications?! So the step from 4.0.x (or even 3.x) to 4.2 will require
quite some work.
As an example, a call to "LzFocus#clearFocus()" needs to changed like
so, from:
> new LzDelegate(LzFocus, "clearFocus", this, "onfoo");
to:
> new LzDelegate(this, "_handleFoo", this, "onfoo");
> + private function _handleFoo (ignore:*) {LzFocus.clearFocus();}
or to (short-form):
> new LzDelegate({_handle: function (ignore) {LzFocus.clearFocus();}},
> "_handle", this, "onfoo");
On 5/3/2008 10:18 PM, P T Withington wrote:
> Yes, I am not _really_ happy with the solution, but I think it is the
> best compromise.
>
> I think there are three cases to consider:
>
> 1) You are writing a method that you will use as an event handler, e.g.,
>
> <handler name="onfoo" method="handleOnfoo" />
>
> In this case, you have specifically declared your intent to handle a
> sendEvent message, which by definition calls your handler method with
> one value. You had better accept that value, even if you ignore it;
> otherwise, your method is not eligible to be an event handler. So you
> define your method:
>
> <method name="handleOnfoo" args="value">
> Debug.debug("onfoo sent: %w", value);
> </method>
>
> If your handler method does not accept the sendEvent value, you will
> get a warning and you should fix it.
>
> 2) You have a method that you want called when an event happens, e.g.,
>
> <... onfoo="eventHappens()" ...>
>
> or
>
> <handler name="onfoo">
> eventHappens();
> </handler>
>
> In this case, you are using the open tag event syntax or the handler
> tag to make the connection between an event and a method, which
> automatically introduces an 'event handling wrapper' with the
> requisite argument processing, so your method can take whatever form
> you like. (Note: you can declare args in the handler tag if you want
> the sendEvent value, but if you don't the tag compiler will
> automatically declare one ignore arg for you.)
>
> 3) You are basically cheating. You are trying to use a method that
> was not intended to be an event handler and tie it directly to an
> event. You could get away with this in the past because the runtime
> did not care if methods were called with the correct number and type
> of arguments. You can't any more. You have two choices:
>
> a) Add a nonsensical `ignore` parameter to your method to match the
> sendEvent call (and repair all other calls of your method to pass a
> `null` value).
>
> b) Do the right thing: either use the <handler> tag, or if you are in
> Javascript, your own wrapper, to mediate between the event and the
> other method.
>
> --
>
> I think what you are complaining about is case 3, which was done
> flagrantly throughout our system, probably as a premature
> optimization. I think we just have to fix these cases. If we
> _really_ think the event and handler are so central to the performance
> of the system, then we will have to add that `ignore` parameter (3a).
> But most likely, we can fix this cleanly by using the handler tag or a
> javascript wrapper (3b), which should not be as objectionable.
>
> I _do_ think it is important to discourage people from taking the 3a
> route as much as possible. (Although I may have been lazy and done
> this myself in a couple of places already.)
>
> On 2008-05-03, at 10:12 EDT, André Bargull wrote:
>
>> We're adding an "ignore"-argument all over the place, so that our
>> event-system works in swf9.
>> This a really cumbersome work and some of these warnings don't really
>> help you:
>>> WARNING @lz/gridcolumn.lzx#90: Invalid delegate: «LzCursorService
>>> function(0)#0| kernel/swf/LzMouseKernel.as#59/21» (must accept one
>>> argument to handle .resizer.onmouseout)
>>
>> This warning was triggered by "LzSprite#setCursor(..)" (swf), because
>> there is this delegate:
>>> this._muDel = new LzDelegate( LzMouseKernel , 'restoreCursor',
>>> this.owner , 'onmouseout');
>> And as "LzMouseKernel#restoreCursor()" does expect an argument (why
>> should it!?), you get this warning.
>>
>> If we followed our current practice, we would add an
>> "ignore"-argument to "LzMouseKernel#restoreCursor()". But that's not
>> really convincing, to change a semi-public API (see LzCursor) just to
>> get around this. Also think about user applications, which may have a
>> delegate to i.e. "LzFocus#clearFocus()". They'll get a warning,
>> because the LzFocus-API is not compatible to the event-API. So, do we
>> need to change the public "LzFocus#clearFocus()" API because of this?
>> Surely not!
>>
>> Therefore, I'd like to propose:
>> - either do the function wrapping in "LzDelegate#register(..)" in
>> swf9 automatically, but without any warnings (but consider possible
>> performance disadvantages!)
>> - or add at compile to every function without any arguments a default
>> "ignore"-argument, so that it is compatible to our event-system.
>>
>> Thoughts?
>
>
More information about the Laszlo-dev
mailing list