generateObjectManager method
void
generateObjectManager()
Implementation
void generateObjectManager() {
output.writeLn('class \$ObjectManager {');
for (var type in typeMap.allTypes.values) {
if (type.canBeSingleton()) {
String getterName = type.varName;
output.writeLn('${type.creatorName}? _${getterName};');
output.writeLn('${type.creatorName} get ${getterName} {');
output.writeLn('if(_${getterName} == null){');
output.writeLn('_${getterName} = ' + type.generateCreator() + ';');
output.writeLn('}');
output.writeLn('return _${getterName} as ${type.creatorName};');
output.writeLn('}');
}
}
typeMap.subtypeInstanes.values.forEach((typeInfo){
output.writeLn('Map<String, ${typeInfo.uniqueName}>? _instancesOf${typeInfo.flatName};');
output.writeLn('Map<String, ${typeInfo.uniqueName}> get instancesOf${typeInfo.flatName} {');
output.writeLn('if (_instancesOf${typeInfo.flatName} != null) return _instancesOf${typeInfo.flatName}!;');
output.writeLn('return _instancesOf${typeInfo.flatName} = {');
typeMap.getNonAbstractSubtypes(typeInfo).forEach((subtypeInfo){
if (subtypeInfo.allRequiredFields().length == 0) {
output.writeLn('${subtypeInfo.classCodeAsReference}: ');
output.writeLn(subtypeInfo.varName);
//output.writeMany(subtypeInfo.generateCreator());
output.writeLn(',');
} else {
output.writeLn('//${subtypeInfo.fullName} requires a param');
}
});
output.writeLn('};');
output.writeLn('}');
});
typeMap.subtypeFactories.forEach((key, subtypeFactoryInfo) {
output.writeLn('${subtypeFactoryInfo.returnType.uniqueName} ${key} {');
//output.writeLn('switch(className){');
for (var type in typeMap.getNonAbstractSubtypes(subtypeFactoryInfo.returnType)) {
//TODO compare parameters by types and names?
//type.allRequiredFields().map((f) => f.name).join(',');
if (type.allRequiredFields().length == subtypeFactoryInfo.arguments.length - 1) {
output.writeLn('if (className == ${type.classCodeAsReference})');
output.writeLn('return ' + type.generateCreator() + ';');
//output.writeLn('case ${type.classCodeAsReference}:');
//output.writeLn('return ' + type.generateCreator() + ';');
}
}
//output.writeLn('}');
output.writeLn('throw new Exception(\'no type for \' + className);');
output.writeLn('}');
});
typeMap.subtypesOf.values.forEach((typeInfo) {
output.writeLn('SubtypesOf<${typeInfo.uniqueName}> subtypesOf${typeInfo.flatName} = new \$SubtypesOf' + typeInfo.flatName + '();');
});
output.writeLn('final List<String> s = const [');
output.writeLn(typeMap.allSymbols.map((e) => '"$e"').join(','));
output.writeLn('];');
output.writeLn('}');
output.writeLn('\$ObjectManager \$om = new \$ObjectManager();');
}