header only. no Qt dependency