move declaration to header
refactor
remove client code
move function
move function
move function
make public
move function
move function
move function
move code
refactor
separate compilation