making more opaque types and keeping private implementation away from the user