public final void putAll(Map map) {
		Set keys = map.keySet();
		Iterator i = keys.iterator();

		//
		// if the argument is a multi-map, we want to add all of the
		// values individually, otherwise each key will have a set
		// of values whose only value is... the collection of values.
		// that is, instead of key -> collection<value>, we'd have
		// key -> collection<collection<value>>
		//
		if (map instanceof MultiMap) {
			while (i.hasNext()) {
				Object key = i.next();
				Object value = map.get(key);

				Collection setOfValues = (Collection) value;
				Iterator j = setOfValues.iterator();

				while (j.hasNext())
					put(key, j.next());
			}
		}

		//
		// it's a "normal" map - just add the name-value pairs
		//
		else {
			while (i.hasNext()) {
				Object key = i.next();
				put(key, map.get(key));
			}
		}
	}