Mercurial Hosting > luan
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 |
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 |
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 | 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 | 33 |
34 @Override public boolean hasNext() { | |
35 return iter.hasNext(); | |
36 } | |
37 @Override public Object next() { | |
38 return iter.next().getKey(); | |
39 } | |
40 @Override public void remove() { | |
41 throw new UnsupportedOperationException(); | |
42 } | |
43 }; | |
44 } | |
45 | |
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 } |