factored out lenses and prisms as they aren't used in the core