'
	s
		s

// function
function hashKey(obj) {
	/*
	 * test comment
	 */
	var objType = typeof obj,
			key;

	if (objType == 'object' && obj !== null) {
		if (typeof (key = obj.$$hashKey) == 'function') {
			// must invoke on object to keep the right this
			key = obj.$$hashKey();
		} else if (key === undefined) {
			key = obj.$$hashKey = nextUid();
		}
	} else {
		key = obj;
	}

	return objType + ':' + key;
}

function HashMap(array){
	forEach(array, this.put, this);
}
HashMap.prototype = {
	/**
	 * Store key value pair
	 * @param key key to store can be any type
	 * @param value value to store can be any type
	 */
	put: function(key, value) {
		this[hashKey(key)] = value;
	},

	/**
	 * @param key
	 * @returns {Object} the value for the key
	 */
	get: function(key) {
		return this[hashKey(key)];
	},

	/**
	 * Remove the key/value pair
	 * @param key
	 */
	remove: function(key) {
		var value = this[key = hashKey(key)];
		delete this[key];
		return value;
	}
};