// Path: src/main/java/com/btk5h/skriptmirror/JavaType.java
// public final class JavaType {
//   private final Class<?> javaClass;
// 
//   public JavaType(Class<?> javaClass) {
//     this.javaClass = javaClass;
//   }
// 
//   public Class<?> getJavaClass() {
//     return javaClass;
//   }
// 
//   @Override
//   public boolean equals(Object o) {
//     if (this == o) return true;
//     if (o == null || getClass() != o.getClass()) return false;
//     JavaType javaType1 = (JavaType) o;
//     return Objects.equals(javaClass, javaType1.javaClass);
//   }
// 
//   @Override
//   public int hashCode() {
//     return Objects.hash(javaClass);
//   }
// }
// 
// Path: src/main/java/com/btk5h/skriptmirror/LibraryLoader.java
// public class LibraryLoader {
//   private static ClassLoader classLoader = LibraryLoader.class.getClassLoader();
// 
//   private static final PathMatcher MATCHER =
//       FileSystems.getDefault().getPathMatcher("glob:**/*.jar");
// 
//   private static class LibraryVisitor extends SimpleFileVisitor<Path> {
//     private List<URL> urls = new ArrayList<>();
// 
//     @Override
//     public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
//       if (MATCHER.matches(file)) {
//         Skript.info("Loaded external library " + file.getFileName());
//         urls.add(file.toUri().toURL());
//       }
//       return super.visitFile(file, attrs);
//     }
// 
//     public URL[] getUrls() {
//       return urls.toArray(new URL[urls.size()]);
//     }
//   }
// 
//   public static void loadLibraries(Path dataFolder) throws IOException {
//     if (Files.isDirectory(dataFolder)) {
//       LibraryVisitor visitor = new LibraryVisitor();
//       Files.walkFileTree(dataFolder, visitor);
//       classLoader = new URLClassLoader(visitor.getUrls(), LibraryLoader.class.getClassLoader());
//     } else {
//       Files.createDirectory(dataFolder);
//     }
//   }
// 
//   public static ClassLoader getClassLoader() {
//     return classLoader;
//   }
// }


import ch.njol.skript.Skript;
import ch.njol.skript.lang.Expression;
import ch.njol.skript.lang.ExpressionType;
import ch.njol.skript.lang.SkriptParser;
import ch.njol.skript.lang.util.SimpleExpression;
import ch.njol.util.Kleenean;
import com.btk5h.skriptmirror.JavaType;
import com.btk5h.skriptmirror.LibraryLoader;
import org.bukkit.event.Event;
package com.btk5h.skriptmirror.skript.reflect;


public class ExprJavaType extends SimpleExpression<JavaType> {
  static {
    Skript.registerExpression(ExprJavaType.class, JavaType.class, ExpressionType.COMBINED,
        "[the] [java] class %string%");
  }

  private Expression<String> className;

  @Override
  protected JavaType[] get(Event e) {
    String cls = className.getSingle(e);

    if (cls == null) {
      return null;
    }

    try {
// Path: src/main/java/com/btk5h/skriptmirror/JavaType.java
// public final class JavaType {
//   private final Class<?> javaClass;
// 
//   public JavaType(Class<?> javaClass) {
//     this.javaClass = javaClass;
//   }
// 
//   public Class<?> getJavaClass() {
//     return javaClass;
//   }
// 
//   @Override
//   public boolean equals(Object o) {
//     if (this == o) return true;
//     if (o == null || getClass() != o.getClass()) return false;
//     JavaType javaType1 = (JavaType) o;
//     return Objects.equals(javaClass, javaType1.javaClass);
//   }
// 
//   @Override
//   public int hashCode() {
//     return Objects.hash(javaClass);
//   }
// }
// 
// Path: src/main/java/com/btk5h/skriptmirror/LibraryLoader.java
// public class LibraryLoader {
//   private static ClassLoader classLoader = LibraryLoader.class.getClassLoader();
// 
//   private static final PathMatcher MATCHER =
//       FileSystems.getDefault().getPathMatcher("glob:**/*.jar");
// 
//   private static class LibraryVisitor extends SimpleFileVisitor<Path> {
//     private List<URL> urls = new ArrayList<>();
// 
//     @Override
//     public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
//       if (MATCHER.matches(file)) {
//         Skript.info("Loaded external library " + file.getFileName());
//         urls.add(file.toUri().toURL());
//       }
//       return super.visitFile(file, attrs);
//     }
// 
//     public URL[] getUrls() {
//       return urls.toArray(new URL[urls.size()]);
//     }
//   }
// 
//   public static void loadLibraries(Path dataFolder) throws IOException {
//     if (Files.isDirectory(dataFolder)) {
//       LibraryVisitor visitor = new LibraryVisitor();
//       Files.walkFileTree(dataFolder, visitor);
//       classLoader = new URLClassLoader(visitor.getUrls(), LibraryLoader.class.getClassLoader());
//     } else {
//       Files.createDirectory(dataFolder);
//     }
//   }
// 
//   public static ClassLoader getClassLoader() {
//     return classLoader;
//   }
// }


// Path: src/main/java/com/btk5h/skriptmirror/skript/reflect/ExprJavaType.java
import ch.njol.skript.Skript;
import ch.njol.skript.lang.Expression;
import ch.njol.skript.lang.ExpressionType;
import ch.njol.skript.lang.SkriptParser;
import ch.njol.skript.lang.util.SimpleExpression;
import ch.njol.util.Kleenean;
import com.btk5h.skriptmirror.JavaType;
import com.btk5h.skriptmirror.LibraryLoader;
import org.bukkit.event.Event;

package com.btk5h.skriptmirror.skript.reflect;


public class ExprJavaType extends SimpleExpression<JavaType> {
  static {
    Skript.registerExpression(ExprJavaType.class, JavaType.class, ExpressionType.COMBINED,
        "[the] [java] class %string%");
  }

  private Expression<String> className;

  @Override
  protected JavaType[] get(Event e) {
    String cls = className.getSingle(e);

    if (cls == null) {
      return null;
    }

    try {
      return new JavaType[]{new JavaType(LibraryLoader.getClassLoader().loadClass(cls))};