Mercurial Hosting > luan
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 |
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 | 3 import java.util.Map; |
4 import java.util.Iterator; | |
407
7fd9f1b7b878
replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
5 |
413 | 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 | 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 | 37 |
38 @Override public boolean hasNext() { | |
39 return iter.hasNext(); | |
40 } | |
41 @Override public Object next() { | |
42 return iter.next().getKey(); | |
43 } | |
44 @Override public void remove() { | |
45 throw new UnsupportedOperationException(); | |
46 } | |
47 }; | |
48 } | |
49 | |
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 } |