restructure the code to make it easier to understand