diff src/luan/lib/JavaLib.java @ 108:3c404a296995

make Package module more standard; return _ENV by default; add "import" statement; git-svn-id: https://luan-java.googlecode.com/svn/trunk@109 21e917c8-12df-6dd8-5cb6-c86387c605b9
author fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
date Fri, 23 May 2014 03:21:54 +0000
parents 90b918cbf888
children f5af13062b10
line wrap: on
line diff
--- a/src/luan/lib/JavaLib.java	Mon May 19 09:17:57 2014 +0000
+++ b/src/luan/lib/JavaLib.java	Fri May 23 03:21:54 2014 +0000
@@ -21,7 +21,6 @@
 import luan.MetatableGetter;
 import luan.LuanException;
 import luan.LuanFunction;
-import luan.LuanLoader;
 import luan.LuanJavaFunction;
 import luan.LuanElement;
 
@@ -30,28 +29,36 @@
 
 	public static final String NAME = "Java";
 
-	public static final LuanLoader LOADER = new LuanLoader() {
-		@Override protected void load(LuanState luan) {
+	public static final LuanFunction LOADER = new LuanFunction() {
+		@Override public Object[] call(LuanState luan,Object[] args) {
 			luan.addMetatableGetter(mg);
 			LuanTable module = new LuanTable();
-			LuanTable global = new LuanTable();
-			module.put( LuanState._G, global );
+			LuanTable global = luan.global();
 			try {
-				global.put( "import", new LuanJavaFunction(JavaLib.class.getMethod("importClass",LuanState.class,String.class),null) );
 				module.put( "class", new LuanJavaFunction(JavaLib.class.getMethod("getClass",LuanState.class,String.class),null) );
 				add( module, "proxy", LuanState.class, Static.class, LuanTable.class, Object.class );
 			} catch(NoSuchMethodException e) {
 				throw new RuntimeException(e);
 			}
-			luan.loaded().put(NAME,module);
+			luan.searchers().add(javaSearcher);
+			return new Object[]{module};
 		}
 	};
 
-	private static final LuanTable mt = new LuanTable();
-	static {
-		add( mt, "__index", LuanState.class, Object.class, Object.class );
-		add( mt, "__newindex", LuanState.class, Object.class, Object.class, Object.class );
-	}
+	public static final LuanFunction javaSearcher = new LuanFunction() {
+		@Override public Object[] call(LuanState luan,Object[] args) throws LuanException {
+			String modName = (String)args[0];
+			final Static s = JavaLib.getClass(luan,modName);
+			if( s==null )
+				return LuanFunction.EMPTY;
+			LuanFunction loader = new LuanFunction() {
+				@Override public Object[] call(LuanState luan,Object[] args) {
+					return new Object[]{s};
+				}
+			};
+			return new Object[]{loader};
+		}
+	};
 
 	private static void add(LuanTable t,String method,Class<?>... parameterTypes) {
 		try {
@@ -61,6 +68,12 @@
 		}
 	}
 
+	private static final LuanTable mt = new LuanTable();
+	static {
+		add( mt, "__index", LuanState.class, Object.class, Object.class );
+		add( mt, "__newindex", LuanState.class, Object.class, Object.class, Object.class );
+	}
+
 	private static final MetatableGetter mg = new MetatableGetter() {
 		public LuanTable getMetatable(Object obj) {
 			if( obj==null )
@@ -330,16 +343,16 @@
 			try {
 				cls = Thread.currentThread().getContextClassLoader().loadClass(name);
 			} catch(ClassNotFoundException e2) {
-				throw luan.JAVA.exception(e);
+				return null;
 			}
 		}
 		return new Static(cls);
 	}
-
+/*
 	public static void importClass(LuanState luan,String name) throws LuanException {
 		luan.currentEnvironment().put( name.substring(name.lastIndexOf('.')+1), getClass(luan,name) );
 	}
-
+*/
 	static class AmbiguousJavaFunction extends LuanFunction {
 		private final Map<Integer,List<LuanJavaFunction>> fnMap = new HashMap<Integer,List<LuanJavaFunction>>();