- added OutputListener
- changed some protected method to override in super
- added IOException to abstract method