code: public <T extends SingletonObject> T getSingleton(Class<T> type) {
          if (getParent() != null) {
              return getParent().getSingleton(type);
          }
  
          String key = type.getName();
          T singleton = get(key, type);
          if (singleton == null) {
              try {
                  try {
                      Constructor<T> constructor = type.getDeclaredConstructor(Scope.class);
                      constructor.setAccessible(true);
                      singleton = constructor.newInstance(this);
                  } catch (NoSuchMethodException e) { //try without scope
                      Constructor<T> constructor = type.getDeclaredConstructor();
                      constructor.setAccessible(true);
                      singleton = constructor.newInstance();
                  }
              } catch (Exception e) {
                  throw new UnexpectedLiquibaseException(e);
              }
  
              values.put(key, singleton);
          }
          return singleton;
      }
docs: Looks up the singleton object of the given type. If the singleton has not been created yet, it will be instantiated.
  The singleton is a singleton based on the root scope and the same object will be returned for all child scopes of the root.