public override string GetCode() { string entityClassName = FileManager.RemovePath(FileManager.RemoveExtension(EntitySave.Name)); string baseEntityName = null; if (!string.IsNullOrEmpty(EntitySave.BaseEntity)) { EntitySave rootEntitySave = EntitySave.GetRootBaseEntitySave(); // There could be an invalid inheritance chain. We don't want Glue to bomb if so, so // we'll check for this. if (rootEntitySave != null && rootEntitySave != EntitySave) { baseEntityName = rootEntitySave.Name; } } string factoryClassName = ClassName; ClassProperties classProperties = new ClassProperties(); classProperties.NamespaceName = ProjectManager.ProjectNamespace + ".Factories"; classProperties.ClassName = factoryClassName + " : IEntityFactory"; classProperties.Members = new List <FlatRedBall.Instructions.Reflection.TypedMemberBase>(); classProperties.UntypedMembers = new Dictionary <string, string>(); string positionedObjectListType = string.Format("FlatRedBall.Math.PositionedObjectList<{0}>", entityClassName); // Factories used to be always static but we're going to make them singletons instead //classProperties.IsStatic = true; classProperties.UsingStatements = new List <string>(); classProperties.UsingStatements.Add(GlueCommands.Self.GenerateCodeCommands.GetNamespaceForElement(EntitySave)); classProperties.UsingStatements.Add("System"); if (!string.IsNullOrEmpty(baseEntityName)) { EntitySave baseEntity = ObjectFinder.Self.GetEntitySave(baseEntityName); classProperties.UsingStatements.Add(GlueCommands.Self.GenerateCodeCommands.GetNamespaceForElement(baseEntity)); } classProperties.UsingStatements.Add("FlatRedBall.Math"); classProperties.UsingStatements.Add("FlatRedBall.Graphics"); classProperties.UsingStatements.Add(ProjectManager.ProjectNamespace + ".Performance"); ICodeBlock codeContent = CodeWriter.CreateClass(classProperties); const int numberOfInstancesToPool = 20; var methodTag = codeContent.GetTag("Methods")[0]; var methodBlock = GetAllFactoryMethods(factoryClassName, baseEntityName, numberOfInstancesToPool, ShouldPoolObjects); methodTag.InsertBlock(methodBlock); var codeBlock = new CodeBlockBase(null); codeBlock.Line("static string mContentManagerName;"); codeBlock.Line("static System.Collections.Generic.List<System.Collections.IList> ListsToAddTo = new System.Collections.Generic.List<System.Collections.IList>();"); codeBlock.Line(string.Format("static PoolList<{0}> mPool = new PoolList<{0}>();", entityClassName)); codeBlock.Line(string.Format("public static Action<{0}> EntitySpawned;", entityClassName)); ImplementIEntityFactory(factoryClassName, codeBlock); #region Self and mSelf codeBlock.Line("static " + factoryClassName + " mSelf;"); var selfProperty = codeBlock.Property("public static " + factoryClassName, "Self"); var selfGet = selfProperty.Get(); selfGet.If("mSelf == null") .Line("mSelf = new " + entityClassName + "Factory" + "();"); selfGet.Line("return mSelf;"); #endregion ((codeContent.BodyCodeLines.Last() as CodeBlockBase).BodyCodeLines.Last() as CodeBlockBase).InsertBlock(codeBlock); return(codeContent.ToString()); }