class InformationMapping {

    public <T> Map<String, T> searchAll(S source, String pattern, Class<T> tclass) {
        LinkedHashMap<String, T> list = new LinkedHashMap<>();
        WildCards wc = new WildCards(pattern);
        synchronized (this) {
            for (Entry<String, TFunction<S, ?>> x : map.entrySet()) {
                if (wc.match(x.getKey())) {
                    TFunction<S, ?> fn = x.getValue();
                    if (tclass.isAssignableFrom(fn.targetClass)) {
                        list.put(x.getKey(), (T) fn.extractor.apply(source));
                    }
                }
            }
            for (Entry<String, TListFunction<S, ?>> x : lmap.entrySet()) {
                TListFunction<S, ?> fn = x.getValue();
                if (tclass.isAssignableFrom(fn.targetClass)) {
                    // far to be optimal... TO IMPROVE
                    for (int i = fn.start; i <= fn.end; ++i) {
                        String key = listKey(x.getKey(), i);
                        if (wc.match(key)) {
                            list.put(key, (T) fn.extractor.apply(source, i));
                        }
                    }
                }
            }
        }
        return list;
    }

    public  InformationMapping(Class<S> sourceClass);

}