public override bool Convert(ConvertOperation convert)
		{
			List<object> results = new List<object>();
			List<Font> availData = convert.Perform<Font>().ToList();

			// Generate objects
			foreach (Font font in availData)
			{
				if (convert.IsObjectHandled(font)) continue;

				GameObject gameobj = convert.Result.OfType<GameObject>().FirstOrDefault();
				TextRenderer renderer = convert.Result.OfType<TextRenderer>().FirstOrDefault();
				if (renderer == null && gameobj != null) renderer = gameobj.GetComponent<TextRenderer>();
				if (renderer == null) renderer = new TextRenderer();
				convert.SuggestResultName(renderer, font.Name);
					
				if (!renderer.Text.Fonts.Contains(font))
				{
					var fonts = renderer.Text.Fonts.ToList();
					if (fonts[0] == Font.GenericMonospace10) fonts.RemoveAt(0);
					fonts.Add(font);
					renderer.Text.Fonts = fonts.ToArray();
					renderer.Text.ApplySource();
				}

				results.Add(renderer);
				convert.MarkObjectHandled(font);
			}

			convert.AddResult(results);
			return false;
		}
		void ICmpUpdatable.OnUpdate()
		{
			if (this.volumeText == null)
			{
				// still don't have it.. grab the TextRenderer
				this.volumeText = this.GameObj.GetComponent<TextRenderer>();
			}

			// update the volume value
			volumeText.Text.SourceText = String.Format("Volume {0:0.0}", DualityApp.UserData.SfxMasterVol);
		}
		public static void Init(TextRenderer targetText)
		{
			CommentGuy.targetText = targetText;
			CommentGuy.schedule = new List<Comment>();

			// Load permanent data, if existing
			if (permanentMind == null)
			{
				string mindPath = Path.Combine(Path.GetDirectoryName(DualityApp.UserDataPath), "mind.dat");
				if (File.Exists(mindPath))
				{
					try
					{
						using (FileStream stream = File.OpenRead(mindPath))
						{
							using (Formatter formatter = Formatter.Create(stream))
							{
								permanentMind = formatter.ReadObject() as PermanentData;
							}
						}
					}
					catch (Exception e)
					{
						Log.Game.WriteError("Error loading permanent data: {0}", Log.Exception(e));
					}
				}
			}

			// Create new permanent data, if not
			if (permanentMind == null) permanentMind = new PermanentData();
			if (temporaryMind == null) temporaryMind = new TemporaryData();
			
			// Only do once what is behind this line.
			if (initialized) return;
			initialized = true;

			DualityApp.Terminating += (s, e) => Terminate();
			temporaryMind.TimeSinceLastMet = DateTime.Now - permanentMind.TimeShutdown;
		}