content: package com.github.aesteve.vertx.nubes.reflections.visitors;
  
  import com.github.aesteve.vertx.nubes.Config;
  import com.github.aesteve.vertx.nubes.services.ServiceRegistry;
  import io.vertx.ext.web.Router;
  
  import java.lang.reflect.Field;
  
  abstract class BaseVisitor<T> {
  
    protected T instance;
    protected final Class<T> clazz;
    protected final Router router;
    protected final Config config;
    protected String path;
  
    BaseVisitor(Class<T> clazz, Config config, Router router) {
      this.clazz = clazz;
      this.config = config;
      this.router = router;
    }
  
    void injectServices() throws IllegalAccessException {
      final ServiceRegistry serviceRegistry = config.getServiceRegistry();
      for (Field field : instance.getClass().getDeclaredFields()) {
        Object service = serviceRegistry.get(field);
        setFieldAccessible(router, instance, service, field);
      }
      for (Field field : instance.getClass().getSuperclass().getDeclaredFields()) {
        Object service = serviceRegistry.get(field);
        setFieldAccessible(router, instance, service, field);
      }
    }
  
    private void setFieldAccessible(Router router, Object instance, Object service, Field field) throws IllegalAccessException {
      if (service != null) {
        field.setAccessible(true);
        field.set(instance, service);
      } else if (field.getType().equals(Router.class)) {
        field.setAccessible(true);
        field.set(instance, router);
      }
  
    }
  
    void normalizePath() {
      if (!path.endsWith("/*")) {
        if (path.endsWith("/")) {
          path += "*";
        } else {
          path += "/*";
        }
      }
    }
  }
  