@Override
    @SuppressWarnings("unchecked")
    protected void doConfigure() {
      for (Class<?> clazz : testCase.getClass().getDeclaredClasses()) {
        BindTo bindTo = clazz.getAnnotation(BindTo.class);
        if (bindTo == null) continue;
        List<Annotation> qualifiers = harvestQualifiers(clazz);
        Annotation classifier = qualifiers.isEmpty() ? null : qualifiers.get(0);
        boolean isSingleton = clazz.getAnnotation(Singleton.class) != null;

        AnnotatedBindingBuilder<?> abuilder = bind(bindTo.value());
        if (classifier != null) {
          LinkedBindingBuilder<?> lbuilder = abuilder.withClassifier(classifier);
          if (Provider.class.isAssignableFrom(clazz)) {
            SingletonBindingBuilder<?> sbuilder = lbuilder.toProvider((Class) clazz);
            if (isSingleton) sbuilder.asSingleton();
          } else {
            SingletonBindingBuilder<?> sbuilder = lbuilder.to((Class) clazz);
            if (isSingleton) sbuilder.asSingleton();
          }
        } else {
          if (Provider.class.isAssignableFrom(clazz)) {
            SingletonBindingBuilder<?> sbuilder = abuilder.toProvider((Class) clazz);
            if (isSingleton) sbuilder.asSingleton();
          } else {
            SingletonBindingBuilder<?> sbuilder = abuilder.to((Class) clazz);
            if (isSingleton) sbuilder.asSingleton();
          }
        }
      }
    }
    @Override
    @SuppressWarnings("unchecked")
    protected void doConfigure() {
      for (Field field : testCase.getClass().getDeclaredFields()) {
        BindTo bindTo = field.getAnnotation(BindTo.class);
        if (bindTo == null) continue;
        List<Annotation> qualifiers = harvestQualifiers(field);
        Annotation classifier = qualifiers.isEmpty() ? null : qualifiers.get(0);
        boolean isSingleton = field.getAnnotation(Singleton.class) != null;

        field.setAccessible(true);
        Object instance = null;
        try {
          instance = field.get(testCase);
        } catch (IllegalAccessException e) {
          throw new IllegalArgumentException(e);
        }

        if (instance != null) {
          AnnotatedBindingBuilder<Object> abuilder =
              (AnnotatedBindingBuilder<Object>) bind(bindTo.value());
          if (classifier != null) {
            if (Provider.class.isAssignableFrom(instance.getClass())) {
              SingletonBindingBuilder<?> sbuilder =
                  abuilder.withClassifier(classifier).toProvider((Provider<Object>) instance);
              if (isSingleton) sbuilder.asSingleton();
            } else {
              abuilder.withClassifier(classifier).toInstance(instance);
            }
          } else if (Provider.class.isAssignableFrom(instance.getClass())) {
            SingletonBindingBuilder<?> sbuilder = abuilder.toProvider((Provider<Object>) instance);
            if (isSingleton) sbuilder.asSingleton();
          } else {
            abuilder.toInstance(instance);
          }
        } else {
          AnnotatedBindingBuilder<?> abuilder = bind(bindTo.value());
          if (classifier != null) {
            LinkedBindingBuilder<?> lbuilder = abuilder.withClassifier(classifier);
            if (Provider.class.isAssignableFrom(field.getType())) {
              SingletonBindingBuilder<?> sbuilder = lbuilder.toProvider((Class) field.getType());
              if (isSingleton) sbuilder.asSingleton();
            } else {
              SingletonBindingBuilder<?> sbuilder = lbuilder.to((Class) field.getType());
              if (isSingleton) sbuilder.asSingleton();
            }
          } else {
            if (Provider.class.isAssignableFrom(field.getType())) {
              SingletonBindingBuilder<?> sbuilder = abuilder.toProvider((Class) field.getType());
              if (isSingleton) sbuilder.asSingleton();
            } else {
              SingletonBindingBuilder<?> sbuilder = abuilder.to((Class) field.getType());
              if (isSingleton) sbuilder.asSingleton();
            }
          }
        }
      }
    }