definitive API design (not completely sure)