annotate core/src/luan/LuanPropertyMeta.java @ 416:91af5337b9ae

add LuanMeta.__tostring()
author Franklin Schmidt <fschmidt@gmail.com>
date Thu, 30 Apr 2015 06:28:25 -0600
parents ce8e19567911
children 23a93c118042
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
416
91af5337b9ae add LuanMeta.__tostring()
Franklin Schmidt <fschmidt@gmail.com>
parents: 415
diff changeset
20 protected String type(LuanTable tbl) {
91af5337b9ae add LuanMeta.__tostring()
Franklin Schmidt <fschmidt@gmail.com>
parents: 415
diff changeset
21 return (String)tbl.getMetatable().get("type");
91af5337b9ae add LuanMeta.__tostring()
Franklin Schmidt <fschmidt@gmail.com>
parents: 415
diff changeset
22 }
91af5337b9ae add LuanMeta.__tostring()
Franklin Schmidt <fschmidt@gmail.com>
parents: 415
diff changeset
23
407
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
24 @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
25 Object obj = getters(tbl).get(key);
407
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
26 if( obj == null )
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
27 return null;
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
28 if( !(obj instanceof LuanFunction) )
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
29 throw luan.exception("get for '"+key+"' isn't a function");
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
30 LuanFunction fn = (LuanFunction)obj;
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
31 return luan.call(fn);
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
32 }
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
33
415
ce8e19567911 make LuanPropertyMeta a singleton
Franklin Schmidt <fschmidt@gmail.com>
parents: 413
diff changeset
34 @Override protected Iterator keys(final LuanTable tbl) {
413
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
35 return new Iterator() {
415
ce8e19567911 make LuanPropertyMeta a singleton
Franklin Schmidt <fschmidt@gmail.com>
parents: 413
diff changeset
36 final Iterator<Map.Entry<Object,Object>> iter = getters(tbl).iterator();
413
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
37
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
38 @Override public boolean hasNext() {
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
39 return iter.hasNext();
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
40 }
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
41 @Override public Object next() {
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
42 return iter.next().getKey();
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 @Override public void remove() {
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
45 throw new UnsupportedOperationException();
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
46 }
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
47 };
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
48 }
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
49
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
50
407
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
51 @Override public boolean canNewindex() {
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
52 return true;
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
53 }
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
54
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
55 @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
56 Object obj = setters(tbl).get(key);
407
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
57 if( obj == null )
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
58 throw luan.exception("can't set property '"+key+"'");
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
59 if( !(obj instanceof LuanFunction) )
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
60 throw luan.exception("set for '"+key+"' isn't a function");
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
61 LuanFunction fn = (LuanFunction)obj;
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
62 luan.call(fn,new Object[]{value});
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
63 }
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
64
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
65 @Override public LuanTable newMetatable() {
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
66 LuanTable mt = super.newMetatable();
415
ce8e19567911 make LuanPropertyMeta a singleton
Franklin Schmidt <fschmidt@gmail.com>
parents: 413
diff changeset
67 mt.put( "get", new LuanTable() );
ce8e19567911 make LuanPropertyMeta a singleton
Franklin Schmidt <fschmidt@gmail.com>
parents: 413
diff changeset
68 mt.put( "set", new LuanTable() );
416
91af5337b9ae add LuanMeta.__tostring()
Franklin Schmidt <fschmidt@gmail.com>
parents: 415
diff changeset
69 mt.put( "type", "property" );
407
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
70 return mt;
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
71 }
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
72
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
73 }