separate source in different files
separate implementation