001package cpw.mods.fml.common;
002
003import java.lang.reflect.Field;
004
005public interface ILanguageAdapter {
006    public Object getNewInstance(FMLModContainer container, Class<?> objectClass, ClassLoader classLoader) throws Exception;
007    public boolean supportsStatics();
008    public void setProxy(Field target, Class<?> proxyTarget, Object proxy) throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException;
009
010    public static class ScalaAdapter implements ILanguageAdapter {
011        @Override
012        public Object getNewInstance(FMLModContainer container, Class<?> scalaObjectClass, ClassLoader classLoader) throws Exception
013        {
014            Class<?> sObjectClass = Class.forName(scalaObjectClass.getName()+"$",true,classLoader);
015            return sObjectClass.getField("MODULE$").get(null);
016        }
017
018        @Override
019        public boolean supportsStatics()
020        {
021            return false;
022        }
023
024        @Override
025        public void setProxy(Field target, Class<?> proxyTarget, Object proxy) throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException
026        {
027            Field field = proxyTarget.getField("INSTANCE");
028            Object scalaObject = field.get(null);
029            target.set(scalaObject, proxy);
030        }
031    }
032    public static class JavaAdapter implements ILanguageAdapter {
033        @Override
034        public Object getNewInstance(FMLModContainer container, Class<?> objectClass, ClassLoader classLoader) throws Exception
035        {
036            return objectClass.newInstance();
037        }
038
039        @Override
040        public boolean supportsStatics()
041        {
042            return true;
043        }
044
045        @Override
046        public void setProxy(Field target, Class<?> proxyTarget, Object proxy) throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException,
047                SecurityException
048        {
049            target.set(null, proxy);
050        }
051    }
052}