
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 }