reworked the code a bit to make it more modular