Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[dash-dev] easy listening


Bjorn and I have shown that we can write listeners in Monkey Script. Our approach has been to write a series of scripts that share state through common global scope, identified with the Scope metadata tag. Although this demonstrates the generality of the current implementation, it does not serve the need of casual scripting well.

I would like to write a single script and use additional metadata to trigger the subscribe/unsubscribe logic expected of listeners. We are considering adding a tag something like:

	Listen: objectAccessor().addListener(this)

We solicit advice on this or other schemes to achieve the same effect. Below are some thoughts that come to mind.

Purpose
-------

Allow casually written scripts to avail themselves to information transmitted within Eclipse through listener protocols. Avoid accidental dangling listeners by capturing as much of the listener idiom in the metadata handlers as possible.

Likely Implementation
---------------------

Metadata tag processing would parse the tag value using regular expressions to find the object accessor function and an add listener method. These would be evaluated as follows:

* The object accessor function would be evaluated by the script engine to produce a wrapped java object. It would be an error for the script to not implement the function or for the function to return a non-java object other than null.

* The add listener method will be invoked through java reflection. A corresponding remove message will be inferred and invoked too.

* The type of the addListener argument (this, above) will be retrieved as part of the java reflection and a dynamic proxy created. The proxy will necessarily invoke additional functions within the script engine, wrapping and passing java arguments as indicated by the particular method signature. A script need not implement all handler methods.

Use Cases
---------

* A user saves a script with the Listen: tag. The objectAccessor is immediately invoked and if not null, the subscription is made and listening begins.

If the script had a previously subscribed listener, it will be unsubscribed before the new subscription happens.

* A user invokes a script's main through the monkey menu. Whether or not the main is present, the listen unsubscription/resubscription proceeds so that the object accessor has the opportunity to deliver a different subject.

* A user saves a script with an error or that otherwise foils the unsubscribe/resubscribe mechanism. The user receives notification and any dangling subscription is discarded.

* A user creates a stop-listening menu. It works by causing the object accessor to return null. The listening stops with no error message.

Concerns
--------

Can we predict the pattern of addListener/removeListener methods. Are there other pairs we should recognize?

Are there threading issues?

Can we parse the metadata with regular expressions? Are there variations that people would expect to work that can't be parsed without a context-free grammar.



Thanks and best regards. -- Ward


Back to the top