finished gui abstraction