001package cpw.mods.fml.relauncher;
002
003import java.lang.annotation.ElementType;
004import java.lang.annotation.Retention;
005import java.lang.annotation.RetentionPolicy;
006import java.lang.annotation.Target;
007import java.util.Map;
008
009/**
010 * The base plugin that provides class name meta information to FML to
011 * enhance the classloading lifecycle for mods in FML
012 *
013 * @author cpw
014 *
015 */
016public interface IFMLLoadingPlugin
017{
018    /**
019     * Return a list of classes that implement the ILibrarySet interface
020     *
021     * @return a list of classes that implement the ILibrarySet interface
022     */
023    String[] getLibraryRequestClass();
024    /**
025     * Return a list of classes that implements the IClassTransformer interface
026     * @return a list of classes that implements the IClassTransformer interface
027     */
028    String[] getASMTransformerClass();
029
030    /**
031     * Return a class name that implements "ModContainer" for injection into the mod list
032     * The "getName" function should return a name that other mods can, if need be,
033     * depend on.
034     * Trivially, this modcontainer will be loaded before all regular mod containers,
035     * which means it will be forced to be "immutable" - not susceptible to normal
036     * sorting behaviour.
037     * All other mod behaviours are available however- this container can receive and handle
038     * normal loading events
039     */
040    String getModContainerClass();
041
042    /**
043     * Return the class name of an implementor of "IFMLCallHook", that will be run, in the
044     * main thread, to perform any additional setup this coremod may require. It will be
045     * run <strong>prior</strong> to Minecraft starting, so it CANNOT operate on minecraft
046     * itself. The game will deliberately crash if this code is detected to trigger a
047     * minecraft class loading (TODO: implement crash ;) )
048     */
049    String getSetupClass();
050
051    /**
052     * Inject coremod data into this coremod
053     * This data includes:
054     * "mcLocation" : the location of the minecraft directory,
055     * "coremodList" : the list of coremods
056     * "coremodLocation" : the file this coremod loaded from,
057     */
058    void injectData(Map<String, Object> data);
059
060
061    /**
062     * Annotate your load plugin with a list of package prefixes that will *not* be
063     * processed by the ASM transformation stack.
064     *
065     * Your plugin, and any transformers should *definitely* be in this list, because
066     * otherwise you can face problems with the classloader trying to transform classes
067     * with your transformer, whilst it is *loading* your transformer. Not pretty.
068     *
069     * @author cpw
070     *
071     */
072    @Retention(RetentionPolicy.RUNTIME)
073    @Target(ElementType.TYPE)
074    public @interface TransformerExclusions
075    {
076        public String[] value() default "";
077    }
078}