public SourceConverter() {
			ExtClassCollection classes = new ExtClassCollection();
			CreateClassesFromDir(SourcePath, ref classes);
			//CreateClassesFromDir(@"..\..\ext-2-plugins\", ref classes);
			classes.AddRange(
				CreateCustomClasses("Ext.data.DataReader")
			);

			// delete existing generated files
			string dir = OutputPath + @"Ext\";
//			if(Directory.Exists(dir))
//				Directory.Delete(dir, true);

			foreach (ExtClass ec in classes) {
				// exclude specific classes
				if (ec.Name == "Array"
					|| ec.Name == "Date"
					|| ec.Name == "Function"
					|| ec.Name == "Number"
					|| ec.Name == "String") {
					continue;
				}

				ec.Constructors.AddBaseOverloads(ec, classes);
				ec.Configs.CopyBaseConfigs(ec, classes);
				ec.SaveToDisk(dir);
			}
			CreateAdapterScripts();
		}
		/// <summary>
		/// Creates an empty class. This is needed for compilation
		/// </summary>
		/// <param name="types">An array of strings specifying the classes to create. Each string should bee the fully qulified class name (incl. Namespace)</param>
		public ExtClassCollection CreateCustomClasses(params string[] types) {
			ExtClassCollection classes = new ExtClassCollection();
			foreach (string t in types) {
				if (String.IsNullOrEmpty(t)) continue;
				ExtClass ec = new ExtClass();
				ec.Description = new ExtDescription();
				ec.Constructors = new ExtConstructorCollection();
				ec.Properties = new ExtPropertyCollection();
				ec.Methods = new ExtMethodCollection();
				ec.Events = new ExtEventCollection();
				ec.Configs = new ExtConfigCollection();
				ec.Name = t;
				if (ec.Name.Contains(".")) {
					int p = ec.Name.LastIndexOf('.');
					ec.Namespace = ec.Name.Substring(0, p);
					ec.Name = ec.Name.Substring(p + 1);
				}
				ec.Constructors.AddDefault(ec);
				ec.SourceFile = "custom";
				classes.Add(ec);
			}
			return classes;
		}
		/// <summary>
		/// Parses a list of members and extracts the class definitions
		/// </summary>
		/// <param name="members">A list of members</param>
		/// <returns>The classes parsed</returns>
		public ExtClassCollection ExtractClasses(List<string> members) {
			ExtClassCollection ecs = new ExtClassCollection();
			List<string> lines;
			for (int i = 0; i < members.Count; i++) {
				string m = members[i];
				if (m.Contains("@class")) {
					lines = new List<string>();
					do {
						// capture every line until the next @class definition or the end of the file
						lines.Add(m);
						i++;
						if (i < members.Count) m = members[i];
					} while (!m.Contains("@class") && i < members.Count);
					i--; // step back to allow the next iteration to grab the @class line
					ExtClass cls = Parse(lines);
					ecs.Add(cls);
				}
			}
			return ecs;
		}
		/// <summary>
		/// Recursively goes thru every file in the given folder and converts a javascript class to a C# class
		/// </summary>
		/// <param name="path">the path to look for js files in</param>
		/// <param name="allClasses">the collection of classes to add the found classes to</param>
		public void CreateClassesFromDir(string path, ref ExtClassCollection allClasses) {
			DirectoryInfo dir = new DirectoryInfo(path);
			FileInfo[] files = dir.GetFiles("*.js");
			foreach (FileInfo file in files) {
				if (!file.Name.ToLower().EndsWith(".js")) continue;
				ExtClassCollection classes = LoadFromFile(File.ReadAllLines(file.FullName));
				foreach (ExtClass cls in classes) {
					cls.SourceFile = file.FullName.Replace(SourcePath, String.Empty);
					allClasses.Add(cls);
				}
			}
			foreach (DirectoryInfo subdir in dir.GetDirectories()) {
				if (subdir.Name == ".svn") continue;
				if (subdir.Name == "yui") continue;
				if (subdir.Name == "adapter") continue;
				if (subdir.Name == "legacy") continue;
				CreateClassesFromDir(subdir.FullName, ref allClasses);
			}
		}