/// <summary>
        /// Generates the javascript code for the game described in the specified model.
        /// </summary>
        /// <param name="model">The model that describes the game.</param>
        public string GenerateGameCode(GameModel model)
        {
            if (model == null)
            {
                throw new ArgumentNullException("model");
            }

            Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;

            UpdateModules(model.Units);
            UpdateModules(model);

            var unitModules = new ModuleCollection();

            foreach (var unit in model.Units)
            {
                unitModules = new ModuleCollection(unitModules.Union(unit.Modules, Module.Comparer));
            }

            string background       = model.Background.GenerateCode();
            string modules          = unitModules.GenerateUnitModulesCode() + "\n" + model.Modules.GenerateGameModulesCode();
            string unitConstructors = GenerateUnitConstructors();
            string units            = unitConstructors + model.Units.GenerateCollectionCode((unit) => unit.GenerateCode());
            string bindings         = model.KeyBindings.GenerateCollectionCode((binding) => binding.GenerateCode());

            string game = Regex.Replace(gameTemplate, BackgroundPlaceholder, background, RegexOptions.None);

            game = Regex.Replace(game, ModulesPlaceholder, modules, RegexOptions.None);
            game = Regex.Replace(game, UnitsPlaceholder, units, RegexOptions.None);
            game = Regex.Replace(game, KeyBindingsPlaceholder, bindings, RegexOptions.None);

            return(game);
        }
        /// <summary>
        /// Constructs a new <see cref="JsGenerator"/> using the specified <see cref="ModuleCollection"/>.
        /// </summary>
        /// <param name="modules"></param>
        public JsGenerator(ModuleCollection modules)
        {
            if (modules == null)
            {
                throw new ArgumentNullException("modules");
            }

            gameTemplate  = PathFinder.ReadEmbeddedFile(PathFinder.GameTemplateFile);
            presetModules = modules.ToDictionary(x => x.Name);
        }