solution divided into modules