/// <summary>
        /// Extends the base class by placing the blocks of macros into methods on the base class
        /// of the same name.
        /// </summary>
        /// <example>
        /// MyMethod:
        ///		PerformActions
        ///
        /// If an overridable method called MyMethod exists on <see cref="BaseClassCompilerStep.BaseClass"/>, then
        /// it is overridden as follows:
        /// <code>
        /// public override void MyMethod() { PerformActions(); }
        /// </code>
        /// </example>
        protected override void ExtendBaseClass(Module module, ClassDefinition definition)
        {
            List <MethodInfo> methodsThatAreOverridable = new List <MethodInfo>();

            MethodInfo[] baseClassMethods =
                BaseClass.GetMethods(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public |
                                     BindingFlags.InvokeMethod);

            foreach (MethodInfo method in baseClassMethods)
            {
                if (method.DeclaringType == typeof(object))
                {
                    continue;
                }
                if (method.IsVirtual || method.IsAbstract)
                {
                    methodsThatAreOverridable.Add(method);
                }
            }

            MethodSubstitutionTransformer mst = new MethodSubstitutionTransformer(methodsThatAreOverridable.ToArray(), definition);

            mst.Visit(module);

            foreach (Statement statement in module.Globals.Statements)
            {
                ExpressionStatement es = statement as ExpressionStatement;
                if (es != null)
                {
                    BinaryExpression be = es.Expression as BinaryExpression;
                    if (be != null)
                    {
                        if (be.Left.NodeType == NodeType.ReferenceExpression && be.Operator == BinaryOperatorType.Assign)
                        {
                            ReferenceExpression refExp = be.Left as ReferenceExpression;

                            Field field = new Field(refExp.LexicalInfo);
                            field.Name        = refExp.Name;
                            field.Initializer = be.Right;
                            definition.Members.Add(field);
                        }
                    }
                }
            }

            if (transformers != null)
            {
                foreach (DepthFirstTransformer transformer in transformers)
                {
                    transformer.Visit(module);
                }
            }
        }
		/// <summary>
		/// Extends the base class by placing the blocks of macros into methods on the base class
		/// of the same name.
		/// </summary>
		/// <example>
		/// MyMethod:
		///		PerformActions
		/// 
		/// If an overridable method called MyMethod exists on <see cref="BaseClassCompilerStep.BaseClass"/>, then 
		/// it is overridden as follows:
		/// <code>
		/// public override void MyMethod() { PerformActions(); }
		/// </code>
		/// </example>
		protected override void ExtendBaseClass(Module module, ClassDefinition definition)
		{
			List<MethodInfo> methodsThatAreOverridable = new List<MethodInfo>();

			MethodInfo[] baseClassMethods =
				BaseClass.GetMethods(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public |
									 BindingFlags.InvokeMethod);

			foreach (MethodInfo method in baseClassMethods)
			{
				if(method.DeclaringType==typeof(object))
					continue;
				if (method.IsVirtual || method.IsAbstract)
					methodsThatAreOverridable.Add(method);
			}

			MethodSubstitutionTransformer mst = new MethodSubstitutionTransformer(methodsThatAreOverridable.ToArray(), definition);
			mst.Visit(module);

			foreach (Statement statement in module.Globals.Statements)
			{
				ExpressionStatement es = statement as ExpressionStatement;
				if (es != null)
				{
					BinaryExpression be = es.Expression as BinaryExpression;
					if (be != null)
					{
						if (be.Left.NodeType == NodeType.ReferenceExpression && be.Operator == BinaryOperatorType.Assign)
						{
							ReferenceExpression refExp = be.Left as ReferenceExpression;

							Field field = new Field(refExp.LexicalInfo);
							field.Name = refExp.Name;
							field.Initializer = be.Right;
							definition.Members.Add(field);
						}
					}
				}
			}

			if (transformers != null)
			{
				foreach (DepthFirstTransformer transformer in transformers)
					transformer.Visit(module);
			}
		}