remove unnecessary parameter
only expose interface type to external packages, no structs
rearrange all the methods