refactor: bring detail::eval to public