class ReflectionSetterInvoker {

    public Method findSetter(Class<?> setterHostClass, Object forArg) {
        Class<?> argClass = forArg.getClass();
        Map<Class<?>, Setter> settersMap = setterCache.get(setterHostClass);
        if (settersMap == null) {
            settersMap = new ConcurrentHashMap<Class<?>, Setter>();
            setterCache.put(getClass(), settersMap);
        }

        Setter setter = settersMap.get(argClass);
        if (setter == null) {
            Method method = lookupSetter(setterHostClass, argClass);
            setter = new Setter(method);
            settersMap.put(argClass, setter);
        }

        return setter.getMethod();
    }

}