use Map<String,?> instead of Map<String, Object>
so clients don't have to do unnecessary casting.