package org.jerlang; import static org.jerlang.util.StringUtil.camelToSnakeCase; import java.util.HashMap; import java.util.Map; import org.jerlang.erts.Erlang; import org.jerlang.erts.Init; import org.jerlang.erts.OtpRing0; import org.jerlang.erts.PrimInet; import org.jerlang.kernel.File; import org.jerlang.kernel.NetAdm; import org.jerlang.kernel.OS; import org.jerlang.stdlib.Base64; import org.jerlang.stdlib.BeamLib; import org.jerlang.stdlib.Binary; import org.jerlang.stdlib.ErlInternal; import org.jerlang.stdlib.IO; import org.jerlang.stdlib.Lists; import org.jerlang.stdlib.Maps; import org.jerlang.stdlib.Math; import org.jerlang.stdlib.Shell; import org.jerlang.type.Atom; /** * Global registry for all modules. */ public class ModuleRegistry { private static final ModuleRegistry instance = new ModuleRegistry(); private final Map<Atom, Module> modules; public ModuleRegistry() { modules = new HashMap<>(); // TODO: Auto-register modules by reflection init(Base64.class).export(); init(BeamLib.class).export(); init(Binary.class).export(); init(Erlang.class).export(); init(ErlInternal.class).export(); init(File.class).export(); init(Init.class).export(); init(IO.class).export(); init(Lists.class).export(); init(Maps.class).export(); init(Math.class).export(); init(NetAdm.class).export(); init(OS.class).export(); init(OtpRing0.class).export(); init(PrimInet.class).export(); init(Shell.class).export(); } public static Module get(Atom module) { if (!instance.modules.containsKey(module)) { // Maybe the module is not loaded yet ModuleLoader.load(module); } return instance.modules.get(module); } public static ModuleRegistry instance() { return instance; } public static void register(Module module) { instance.modules.put(module.name(), module); } private Module init(Class<?> moduleClass) { String moduleName = camelToSnakeCase(moduleClass.getSimpleName()); return init(moduleClass, Atom.of(moduleName)); } private Module init(Class<?> moduleClass, Atom module) { modules.put(module, new Module(moduleClass, module)); return modules.get(module); } }