OOP doneish. TODO: Look into threading.