class InformationMapping {

    public void fillDictionary(String prefix, Map<String, Class> dic, boolean compact) {
        synchronized (this) {
            for (Entry<String, TFunction<S, ?>> entry : map.entrySet()) {
                dic.put(InformationSet.item(prefix, entry.getKey()), entry.getValue().targetClass);
            }
            if (compact) {
                for (Entry<String, TListFunction<S, ?>> entry : lmap.entrySet()) {
                    TListFunction<S, ?> fn = entry.getValue();
                    if (fn.start == fn.end) {
                        dic.put(InformationSet.item(prefix, wcKey(entry.getKey(), '?')), fn.targetClass);
                    } else {
                        dic.put(InformationSet.item(prefix, wcKey(entry.getKey(), '*')), fn.targetClass);
                    }
                }
            } else {
                for (Entry<String, TListFunction<S, ?>> entry : lmap.entrySet()) {
                    TListFunction<S, ?> fn = entry.getValue();
                    if (fn.start == fn.end) {
                        dic.put(InformationSet.item(prefix, listKey(entry.getKey(), fn.start)), fn.targetClass);
                    } else {
                        for (int i = fn.start; i <= fn.end; ++i) {
                            dic.put(InformationSet.item(prefix, listKey(entry.getKey(), i)), fn.targetClass);
                        }
                    }
                }
            }
        }
    }

    public  InformationMapping(Class<S> sourceClass);

}