==semantics==

each unit has a map lastOutput. this list is updated whenever
1. an observer triggers an update. bottom-top
2. on evaluate, top-bottom

to support both strategies, there is one entirely stupid function
	evaluate()
which simply reads lastOutput and does something with it. if the dependent
output is not set, it should throw an exception.


== Semantic 1 ==

the observer will call updateBottomUp() which updates the output,
then calls recursively on all the components it outputs to. 


== Semantic 2 ==

updateTopBottom() will update dependencies if needed


== lazyness ==


== maps ==

possible to use the observer system as the input value changes.
as it is asynchronous, need to add synch again once the map output is
updated


== static typing ==

whenever possible, the should be something like
xxx runFlow(xxx)
later allowing real-time code generation with compile-time typing. evaluate should call this
function. this is not strictly needed if the typing sucks because it can easily be detected
when no such function exists and evaluate will be used as a slow alternative.


== script edit ==

http://java.sun.com/docs/books/tutorial/uiswing/components/editorpane.html
or use jedit

== todo ==

http://mgltools.scripps.edu/

* hovering gives type
* larger boxes to hit, going top to bottom
* iterator, not map
* type property "required"

should have UI elements. combine labview front with back.

paper with references


