annotate core/src/luan/LuanPropertyMeta.java @ 415:ce8e19567911

make LuanPropertyMeta a singleton
author Franklin Schmidt <fschmidt@gmail.com>
date Thu, 30 Apr 2015 06:04:17 -0600
parents 8937263f59f6
children 91af5337b9ae
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
407
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1 package luan;
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
2
413
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
3 import java.util.Map;
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
4 import java.util.Iterator;
407
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
5
413
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
6
415
ce8e19567911 make LuanPropertyMeta a singleton
Franklin Schmidt <fschmidt@gmail.com>
parents: 413
diff changeset
7 public final class LuanPropertyMeta extends LuanMeta {
ce8e19567911 make LuanPropertyMeta a singleton
Franklin Schmidt <fschmidt@gmail.com>
parents: 413
diff changeset
8 public static final LuanPropertyMeta INSTANCE = new LuanPropertyMeta();
407
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
9
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
10 private LuanPropertyMeta() {}
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
11
415
ce8e19567911 make LuanPropertyMeta a singleton
Franklin Schmidt <fschmidt@gmail.com>
parents: 413
diff changeset
12 public LuanTable getters(LuanTable tbl) {
ce8e19567911 make LuanPropertyMeta a singleton
Franklin Schmidt <fschmidt@gmail.com>
parents: 413
diff changeset
13 return (LuanTable)tbl.getMetatable().get("get");
407
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
14 }
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
15
415
ce8e19567911 make LuanPropertyMeta a singleton
Franklin Schmidt <fschmidt@gmail.com>
parents: 413
diff changeset
16 public LuanTable setters(LuanTable tbl) {
ce8e19567911 make LuanPropertyMeta a singleton
Franklin Schmidt <fschmidt@gmail.com>
parents: 413
diff changeset
17 return (LuanTable)tbl.getMetatable().get("set");
407
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
18 }
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
19
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
20 @Override public Object __index(LuanState luan,LuanTable tbl,Object key) throws LuanException {
415
ce8e19567911 make LuanPropertyMeta a singleton
Franklin Schmidt <fschmidt@gmail.com>
parents: 413
diff changeset
21 Object obj = getters(tbl).get(key);
407
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
22 if( obj == null )
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
23 return null;
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
24 if( !(obj instanceof LuanFunction) )
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
25 throw luan.exception("get for '"+key+"' isn't a function");
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
26 LuanFunction fn = (LuanFunction)obj;
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
27 return luan.call(fn);
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
28 }
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
29
415
ce8e19567911 make LuanPropertyMeta a singleton
Franklin Schmidt <fschmidt@gmail.com>
parents: 413
diff changeset
30 @Override protected Iterator keys(final LuanTable tbl) {
413
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
31 return new Iterator() {
415
ce8e19567911 make LuanPropertyMeta a singleton
Franklin Schmidt <fschmidt@gmail.com>
parents: 413
diff changeset
32 final Iterator<Map.Entry<Object,Object>> iter = getters(tbl).iterator();
413
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
33
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
34 @Override public boolean hasNext() {
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
35 return iter.hasNext();
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
36 }
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
37 @Override public Object next() {
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
38 return iter.next().getKey();
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
39 }
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
40 @Override public void remove() {
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
41 throw new UnsupportedOperationException();
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
42 }
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
43 };
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
44 }
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
45
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
46
407
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
47 @Override public boolean canNewindex() {
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
48 return true;
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
49 }
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
50
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
51 @Override public void __newindex(LuanState luan,LuanTable tbl,Object key,Object value) throws LuanException {
415
ce8e19567911 make LuanPropertyMeta a singleton
Franklin Schmidt <fschmidt@gmail.com>
parents: 413
diff changeset
52 Object obj = setters(tbl).get(key);
407
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
53 if( obj == null )
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
54 throw luan.exception("can't set property '"+key+"'");
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
55 if( !(obj instanceof LuanFunction) )
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
56 throw luan.exception("set for '"+key+"' isn't a function");
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
57 LuanFunction fn = (LuanFunction)obj;
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
58 luan.call(fn,new Object[]{value});
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
59 }
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
60
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
61 @Override public LuanTable newMetatable() {
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
62 LuanTable mt = super.newMetatable();
415
ce8e19567911 make LuanPropertyMeta a singleton
Franklin Schmidt <fschmidt@gmail.com>
parents: 413
diff changeset
63 mt.put( "get", new LuanTable() );
ce8e19567911 make LuanPropertyMeta a singleton
Franklin Schmidt <fschmidt@gmail.com>
parents: 413
diff changeset
64 mt.put( "set", new LuanTable() );
407
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
65 return mt;
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
66 }
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
67
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
68 }