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();');
}