// Path: reflect/src/main/java/eu/mikroskeem/shuriken/reflect/wrappers/TypeWrapper.java
// public class TypeWrapper {
//     private final Class<?> type;
//     private final Object value;
// 
//     private TypeWrapper(Class<?> type, Object value) {
//         this.type = type;
//         this.value = value;
//     }
// 
//     private TypeWrapper(Object value) {
//         this.type = value.getClass();
//         this.value = value;
//     }
// 
//     public Class<?> getType() {
//         return type;
//     }
// 
//     public Object getValue() {
//         return value;
//     }
// 
//     @NotNull
//     @Contract("null -> fail")
//     public static TypeWrapper of(Object value) {
//         return new TypeWrapper(value);
//     }
// 
//     @NotNull
//     @Contract("!null, _ -> !null; null, _ -> fail")
//     public static TypeWrapper of(Class<?> type, Object value) {
//         if(type == null) throw new IllegalStateException("Type must not be null");
//         return new TypeWrapper(type, value);
//     }
// 
//     @Override
//     public String toString() {
//         return String.format("TypeWrapper{type=%s, value=%s}", type, value);
//     }
// }


import eu.mikroskeem.shuriken.reflect.wrappers.TypeWrapper;
import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Map;
import java.util.Optional;
import java.util.WeakHashMap;
import java.util.stream.Collectors;
import java.util.stream.Stream;
    }

    /**
     * Get {@link Class} by name (like <pre>eu.mikroskeem.reflect.Reflect</pre>)
     * <br>
     * Throws {@link ClassNotFoundException} if class wasn't found
     *
     * @param name Class name
     * @return Class object
     * @param classLoader Classloader where class should be looked
     */
    @NotNull
    @Contract("null, null -> fail")
    public static ClassWrapper<?> getClassThrows(String name, ClassLoader classLoader) {
        return getClass(name, classLoader).orElseGet(() -> {
            Reflect.Utils.throwException(new ClassNotFoundException(name));
            return null;
        });
    }

    /**
     * Construct class with arguments
     *
     * @param classWrapper Class
     * @param args Class (wrapped) arguments
     * @param <T> Type
     * @return Instance of class
     * @see Constructor#newInstance(Object...) for exceptions
     */
    @Contract("null, _ -> fail")
// Path: reflect/src/main/java/eu/mikroskeem/shuriken/reflect/wrappers/TypeWrapper.java
// public class TypeWrapper {
//     private final Class<?> type;
//     private final Object value;
// 
//     private TypeWrapper(Class<?> type, Object value) {
//         this.type = type;
//         this.value = value;
//     }
// 
//     private TypeWrapper(Object value) {
//         this.type = value.getClass();
//         this.value = value;
//     }
// 
//     public Class<?> getType() {
//         return type;
//     }
// 
//     public Object getValue() {
//         return value;
//     }
// 
//     @NotNull
//     @Contract("null -> fail")
//     public static TypeWrapper of(Object value) {
//         return new TypeWrapper(value);
//     }
// 
//     @NotNull
//     @Contract("!null, _ -> !null; null, _ -> fail")
//     public static TypeWrapper of(Class<?> type, Object value) {
//         if(type == null) throw new IllegalStateException("Type must not be null");
//         return new TypeWrapper(type, value);
//     }
// 
//     @Override
//     public String toString() {
//         return String.format("TypeWrapper{type=%s, value=%s}", type, value);
//     }
// }


// Path: reflect/src/main/java/eu/mikroskeem/shuriken/reflect/Reflect.java
import eu.mikroskeem.shuriken.reflect.wrappers.TypeWrapper;
import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Map;
import java.util.Optional;
import java.util.WeakHashMap;
import java.util.stream.Collectors;
import java.util.stream.Stream;

    }

    /**
     * Get {@link Class} by name (like <pre>eu.mikroskeem.reflect.Reflect</pre>)
     * <br>
     * Throws {@link ClassNotFoundException} if class wasn't found
     *
     * @param name Class name
     * @return Class object
     * @param classLoader Classloader where class should be looked
     */
    @NotNull
    @Contract("null, null -> fail")
    public static ClassWrapper<?> getClassThrows(String name, ClassLoader classLoader) {
        return getClass(name, classLoader).orElseGet(() -> {
            Reflect.Utils.throwException(new ClassNotFoundException(name));
            return null;
        });
    }

    /**
     * Construct class with arguments
     *
     * @param classWrapper Class
     * @param args Class (wrapped) arguments
     * @param <T> Type
     * @return Instance of class
     * @see Constructor#newInstance(Object...) for exceptions
     */
    @Contract("null, _ -> fail")
    public static <T> ClassWrapper<T> construct(ClassWrapper<T> classWrapper, TypeWrapper... args) {