try and keep a similar api surface area