Mercurial Hosting > luan
annotate core/src/luan/LuanPropertyMeta.java @ 647:8e8c30b72e9b
move methods from LuanState to Luan
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Tue, 29 Mar 2016 20:39:14 -0600 |
parents | cdc70de628b5 |
children |
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) { |
426
23a93c118042
fix LuanTable.get() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
416
diff
changeset
|
13 return (LuanTable)tbl.getMetatable().rawGet("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) { |
426
23a93c118042
fix LuanTable.get() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
416
diff
changeset
|
17 return (LuanTable)tbl.getMetatable().rawGet("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) { |
426
23a93c118042
fix LuanTable.get() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
416
diff
changeset
|
21 return (String)tbl.getMetatable().rawGet("type"); |
416
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 { |
426
23a93c118042
fix LuanTable.get() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
416
diff
changeset
|
25 Object obj = getters(tbl).rawGet(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) ) |
646
cdc70de628b5
simplify LuanException
Franklin Schmidt <fschmidt@gmail.com>
parents:
578
diff
changeset
|
29 throw new LuanException("get for '"+key+"' isn't a function"); |
407
7fd9f1b7b878
replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
30 LuanFunction fn = (LuanFunction)obj; |
574
6cc2f047019b
remove LuanState.call()
Franklin Schmidt <fschmidt@gmail.com>
parents:
451
diff
changeset
|
31 return fn.call(luan); |
407
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() { |
432
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
428
diff
changeset
|
36 final Iterator<Map.Entry<Object,Object>> iter = getters(tbl).rawIterator(); |
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 |
428
df95199ca4c0
rename __newindex to __new_index
Franklin Schmidt <fschmidt@gmail.com>
parents:
427
diff
changeset
|
55 @Override public void __new_index(LuanState luan,LuanTable tbl,Object key,Object value) throws LuanException { |
426
23a93c118042
fix LuanTable.get() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
416
diff
changeset
|
56 Object obj = setters(tbl).rawGet(key); |
451
d62c35a5cd6b
allow setting non-properties in property table
Franklin Schmidt <fschmidt@gmail.com>
parents:
432
diff
changeset
|
57 if( obj == null ) { |
d62c35a5cd6b
allow setting non-properties in property table
Franklin Schmidt <fschmidt@gmail.com>
parents:
432
diff
changeset
|
58 tbl.rawPut(key,value); |
d62c35a5cd6b
allow setting non-properties in property table
Franklin Schmidt <fschmidt@gmail.com>
parents:
432
diff
changeset
|
59 return; |
d62c35a5cd6b
allow setting non-properties in property table
Franklin Schmidt <fschmidt@gmail.com>
parents:
432
diff
changeset
|
60 } |
407
7fd9f1b7b878
replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
61 if( !(obj instanceof LuanFunction) ) |
646
cdc70de628b5
simplify LuanException
Franklin Schmidt <fschmidt@gmail.com>
parents:
578
diff
changeset
|
62 throw new LuanException("set for '"+key+"' isn't a function"); |
407
7fd9f1b7b878
replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
63 LuanFunction fn = (LuanFunction)obj; |
574
6cc2f047019b
remove LuanState.call()
Franklin Schmidt <fschmidt@gmail.com>
parents:
451
diff
changeset
|
64 fn.call(luan,new Object[]{value}); |
407
7fd9f1b7b878
replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
65 } |
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 @Override public LuanTable newMetatable() { |
7fd9f1b7b878
replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
68 LuanTable mt = super.newMetatable(); |
427
dae264ad6a7b
fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
426
diff
changeset
|
69 mt.rawPut( "get", new LuanTable() ); |
dae264ad6a7b
fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
426
diff
changeset
|
70 mt.rawPut( "set", new LuanTable() ); |
dae264ad6a7b
fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
426
diff
changeset
|
71 mt.rawPut( "type", "property" ); |
407
7fd9f1b7b878
replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
72 return mt; |
7fd9f1b7b878
replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
73 } |
7fd9f1b7b878
replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
74 |
7fd9f1b7b878
replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
75 } |