Support for List and Map

why handle `optional` in the calling method, while we handle the rest of the special types here? Why not move optional handling down into this list of cases so that all the special handling is done in one place?