code: @Override
  	public void put(String key, String groupId, String templateId, String version, Template<?> template) {
  		if(key == null) {
  			Map<String, Template<?>> vMap = gtvTable.get(groupId, templateId);
  			if(vMap == null) {
  				vMap = new HashMap<String, Template<?>>();
  				gtvTable.put(groupId, templateId, vMap);
  			} else if(vMap.containsKey(version)) {
  				throw new IllegalStateException("Powtórzona definicja szablonu " + groupId + ":" + templateId + ":" + version + " (" + key + ")");
  			}
  			vMap.put(version, template);
  		} else if(key.indexOf(':') > 0) {
  			StringTokenizer tokenizer = new StringTokenizer(key, ":", false);
  			groupId = tokenizer.nextToken();
  			templateId = tokenizer.nextToken();
  			version = tokenizer.nextToken();
  
  			Map<String, Template<?>> vMap = gtvTable.get(groupId, templateId);
  			if(vMap == null) {
  				vMap = new HashMap<String, Template<?>>();
  				gtvTable.put(groupId, templateId, vMap);
  			} else if(vMap.containsKey(version)) {
  				throw new IllegalStateException("Powtórzona definicja szablonu " + groupId + ":" + templateId + ":" + version + " (" + key + ")");
  			}
  			vMap.put(version, template);
  		} else {
  			if(kMap.containsKey(key)) {
  				throw new IllegalStateException("Powtórzony klucz szablonu: " + key);
  			}
  			kMap.put(key, template);
  		}
  	}
docs: FIXME: Kod metod 'put' 'contains' i 'get' do optymalizacji!!!