001    package cpw.mods.fml.relauncher;
002    
003    import java.lang.annotation.ElementType;
004    import java.lang.annotation.Retention;
005    import java.lang.annotation.RetentionPolicy;
006    import java.lang.annotation.Target;
007    import 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     */
016    public 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    }