_selector_maps = {}
_catched = {}

throw(id, callback)
	if id in _selector_maps
		hook = _selector_maps[id]
	else    
		hook = {}
	
	hook[selector()] = callback
	_selector_maps[id] = hook

catch(id, params)
	if selector() in _catched
		_catches = _catched[selector()]
	else
		_catches = {}
	
	_catches[id] = params
	_catched[selector()] = _catches

_generate_hooks()
	for catched_selector, config in _catched
		for id, parameter in config
			if id in _selector_maps
				hook = _selector_maps[id]
				for thrown_selector, callback in hook
					{thrown_selector}{catched_selector}
						callback(parameter)


red()
	color red
	catch('button', green)
	catch('field', red)

field()
	display inline
	padding 10px
	border-bottom 2px solid blue
	throw('field', @(){
		border-bottom 2px solid red
		color blue
	})

button()
	padding 5px
	background-color orange
	border 1px solid black
	display inline
	throw('button', @(c){color c})

.bluebutton
	red()
	button()

.button
	button()
	
.wred
	red()
	
.field
	field()
	
.wurst
	.field
		field()
		red()

.debug
	--one _selector_maps
	--two _catched
	
_generate_hooks()