implementation is complete (I think)
public API