docs: function dispatch(target, type, data, direction, global) {
  
  			// TODO: encapsulate this
  			var action = new gui.Action({
  				target: target,
  				type: type,
  				data: data,
  				direction: direction || gui.Action.ASCEND,
  				global: global || false
  			});
  
  			var crawler = new gui.Crawler(gui.CRAWLER_ACTION);
  			crawler.global = action.global || false;
  			crawler[action.direction](target, {
  				/*
  				 * Evaluate action for spirit.
  				 * @param {gui.Spirit} spirit
  				 */
  				handleSpirit: function(spirit) {
  					var directive = gui.Crawler.CONTINUE;
  					if (spirit.action.contains(type)) {
  						spirit.action.$onaction(action);
  						if (action.isConsumed) {
  							directive = gui.Crawler.STOP;
  							action.consumer = spirit;
  						}
  					}
  					return directive;
  				},
  				
  				/*
  				 * Teleport action across domains.
  				 * @see {gui.IframeSpirit}
  				 * @param {Window} win Remote window
  				 * @param {String} uri target origin
  				 * @param {String} key Spiritkey of xdomain IframeSpirit (who will relay the action)
  				 */
  				transcend: function(win, uri, key) {
  					var msg = gui.Action.stringify(action, key);
  					win.postMessage(msg, "*"); // uri
  				}
  			});
  			return action;
  		}