update documentation, added specs, tightened up add_listener