public void Visit(TableColumnArg arg)
        {
            var field = new CodeMemberField();
            field.Name = arg.Variable;
            field.Attributes = MemberAttributes.Public | MemberAttributes.Final;
            field.Type = new CodeTypeReference(TablePrimitive.FromString(arg.Type).Type);

            _codeStack.Peek().ParentMemberDefinitions.Add(field);
        }
        private void BuildIRowReaderImplementation(CodeTypeDeclaration type, TableColumnArg[] tableArgs)
        {
            var method = new CodeMemberMethod();
            method.Name = "Load";
            method.Attributes = MemberAttributes.Public | MemberAttributes.Final;
            method.Parameters.Add(new CodeParameterDeclarationExpression(typeof(string[]), "columns"));

            for (int x = 0; x < tableArgs.Length; x++)
            {
                var varType = TablePrimitive.FromString(tableArgs[x].Type);
                var left = new CodeFieldReferenceExpression(null, tableArgs[x].Variable);
                CodeExpression right = new CodeIndexerExpression(new CodeTypeReferenceExpression("columns"), new CodeSnippetExpression(x.ToString()));
                right = varType.ToNative(right);

                method.Statements.Add(new CodeAssignStatement(left, right));
            }

            type.Members.Add(method);
        }
        private void BuildIRowWriterImplementation(CodeTypeDeclaration type, TableColumnArg[] tableArgs)
        {
            var method = new CodeMemberMethod();
            method.Name = "Line";
            method.Attributes = MemberAttributes.Public | MemberAttributes.Final;
            method.ReturnType = new CodeTypeReference(typeof(string[]));

            var arrayDecl = new CodeVariableDeclarationStatement(typeof(string[]), "print", new CodeArrayCreateExpression(typeof(string[]), tableArgs.Length));
            method.Statements.Add(arrayDecl);
            for (int x = 0; x < tableArgs.Length; x++)
            {
                var left = new CodeIndexerExpression(new CodeTypeReferenceExpression("print"), new CodeSnippetExpression(x.ToString()));
                var right = new CodeMethodInvokeExpression(
                     new CodeMethodReferenceExpression(new CodeTypeReferenceExpression(typeof(string)), "Format"),
                         new CodeSnippetExpression("\"{0}\""), new CodeVariableReferenceExpression(tableArgs[x].Variable));

                method.Statements.Add(new CodeAssignStatement(left, right));
            }

            method.Statements.Add(new CodeMethodReturnStatement(new CodeVariableReferenceExpression("print")));
            type.Members.Add(method);
        }