1 //
2 // Copyright (c) 2006, Brian Frank and Andy Frank
3 // Licensed under the Academic Free License version 3.0
4 //
5 // History:
6 // 4 Jun 06 Brian Frank Creation
7 //
8
9 **
10 ** ReflectPod is the CPod wrapper for a dependent Pod loaded via reflection.
11 **
12 class ReflectPod : CPod
13 {
14
15 new make(ReflectNamespace ns, Pod pod)
16 {
17 this.ns = ns
18 this.pod = pod
19 }
20
21 override readonly ReflectNamespace ns
22
23 override Str name() { return pod.name }
24
25 override Version version() { return pod.version }
26
27 override readonly CType[] types
28 {
29 get
30 {
31 if (!loadedAllTypes)
32 {
33 loadedAllTypes = true
34 pod.types.each |Type t| { resolveType(t.name, true) }
35 }
36 return typeMap.values
37 }
38 }
39
40 override ReflectType resolveType(Str typeName, Bool checked)
41 {
42 // check cache first
43 rt := typeMap[typeName]
44 if (rt != null) return rt
45
46 // use reflection
47 t := pod.findType(typeName, checked)
48 if (t == null) return null
49
50 // make ReflectType and add to both
51 // my own and my namespace cache
52 rt = ReflectType.make(ns, t)
53 typeMap[typeName] = rt
54 ns.types[t.signature] = rt
55 return rt
56 }
57
58 override Str toStr()
59 {
60 return name
61 }
62
63 readonly Pod pod
64 private Str:ReflectType typeMap := Str:ReflectType[:]
65 private Bool loadedAllTypes := false
66
67 }
2 // Copyright (c) 2006, Brian Frank and Andy Frank
3 // Licensed under the Academic Free License version 3.0
4 //
5 // History:
6 // 4 Jun 06 Brian Frank Creation
7 //
8
9 **
10 ** ReflectPod is the CPod wrapper for a dependent Pod loaded via reflection.
11 **
12 class ReflectPod : CPod
13 {
14
15 new make(ReflectNamespace ns, Pod pod)
16 {
17 this.ns = ns
18 this.pod = pod
19 }
20
21 override readonly ReflectNamespace ns
22
23 override Str name() { return pod.name }
24
25 override Version version() { return pod.version }
26
27 override readonly CType[] types
28 {
29 get
30 {
31 if (!loadedAllTypes)
32 {
33 loadedAllTypes = true
34 pod.types.each |Type t| { resolveType(t.name, true) }
35 }
36 return typeMap.values
37 }
38 }
39
40 override ReflectType resolveType(Str typeName, Bool checked)
41 {
42 // check cache first
43 rt := typeMap[typeName]
44 if (rt != null) return rt
45
46 // use reflection
47 t := pod.findType(typeName, checked)
48 if (t == null) return null
49
50 // make ReflectType and add to both
51 // my own and my namespace cache
52 rt = ReflectType.make(ns, t)
53 typeMap[typeName] = rt
54 ns.types[t.signature] = rt
55 return rt
56 }
57
58 override Str toStr()
59 {
60 return name
61 }
62
63 readonly Pod pod
64 private Str:ReflectType typeMap := Str:ReflectType[:]
65 private Bool loadedAllTypes := false
66
67 }