docs: function(map, how, where) {
                          var cid = can.cid(map),
                              firstSerialize = false;
                          if (!serializeMap) {
                              firstSerialize = true;
                              // Serialize might call .attr() so we need to keep different map 
                              serializeMap = {
                                  attr: {},
                                  serialize: {}
                              };
                          }
                          serializeMap[how][cid] = where;
                          // Go through each property.
                          map.each(function(val, name) {
                              // If the value is an `object`, and has an `attrs` or `serialize` function.
                              var result,
                                  isObservable = Map.helpers.isObservable(val),
                                  serialized = isObservable && serializeMap[how][can.cid(val)];
                              if (serialized) {
                                  result = serialized;
                              } else {
                                  if (how === "serialize") {
                                      result = Map.helpers._serialize(map, name, val);
                                  } else {
                                      result = Map.helpers._getValue(map, name, val, how);
                                  }
                              }
                              // this is probably removable
                              if (result !== undefined) {
                                  where[name] = result;
                              }
                          });
  
                          can.__reading(map, '__keys');
                          if (firstSerialize) {
                              serializeMap = null;
                          }
                          return where;
                      }