@Override
	public ICacheable put(Object key, ICacheable value) {
		if (key == null || value == null) {
            throw new NullPointerException("key == null || value == null");
        }

		ICacheable previous = null;
        synchronized (this) {
            mPutCount++;
            mCurrSize += safeSizeOf(key, value);
            previous = mCacheMap.put(key, value);
            if (previous != null) {
            	mCurrSize -= safeSizeOf(key, previous);
            }
        }

        trimToSize(mMaxSize);
        return previous;
	}