re-organize argument passing