why `@private`? same for other exported funs below.