<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>CodeGen</title>
        <link>http://www.ayende.com/Blog/category/456.aspx</link>
        <description>CodeGen</description>
        <language>en-US</language>
        <copyright>Ayende Rahien</copyright>
        <managingEditor>Ayende@ayende.com</managingEditor>
        <generator>Subtext Version 1.9.3.51</generator>
        <item>
            <title>We'll just code-gen our way out of here</title>
            <link>http://ayende.com/Blog/archive/2007/12/16/Well-just-codegen-our-way-out-of-here.aspx</link>
            <description>&lt;p&gt;&lt;/p&gt; &lt;p&gt;First, we have the implementation of the SendPropertyChanged method, can you spot the bug?&lt;/p&gt; &lt;blockquote&gt;&lt;pre&gt;&lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff"&gt;virtual&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; SendPropertyChanged(String propertyName)
{
	&lt;span style="color: #0000ff"&gt;if&lt;/span&gt; ((&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.PropertyChanged != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;))
	{
		&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.PropertyChanged(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; PropertyChangedEventArgs(propertyName));
	}
}&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;Then, you have:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; CustomerID
{
	&lt;span style="color: #0000ff"&gt;get&lt;/span&gt;
	{
		&lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;._CustomerID;
	}
	&lt;span style="color: #0000ff"&gt;set&lt;/span&gt;
	{
		&lt;span style="color: #0000ff"&gt;if&lt;/span&gt; ((&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;._CustomerID != &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;))
		{
			&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.OnCustomerIDChanging(&lt;span style="color: #0000ff"&gt;value&lt;/span&gt;);
			&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.SendPropertyChanging();
			&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;._CustomerID = &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;;
			&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.SendPropertyChanged("&lt;span style="color: #8b0000"&gt;CustomerID&lt;/span&gt;");
			&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.OnCustomerIDChanged();
		}
	}
}&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;And this:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; Customer Customer
{
	&lt;span style="color: #0000ff"&gt;get&lt;/span&gt;
	{
		&lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;._Customer.Entity;
	}
	&lt;span style="color: #0000ff"&gt;set&lt;/span&gt;
	{
		Customer previousValue = &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;._Customer.Entity;
		&lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (((previousValue != &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;) 
					|| (&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;._Customer.HasLoadedOrAssignedValue == &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;)))
		{
			&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.SendPropertyChanging();
			&lt;span style="color: #0000ff"&gt;if&lt;/span&gt; ((previousValue != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;))
			{
				&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;._Customer.Entity = &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;
				previousValue.Orders.Remove(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;);
			}
			&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;._Customer.Entity = &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;;
			&lt;span style="color: #0000ff"&gt;if&lt;/span&gt; ((&lt;span style="color: #0000ff"&gt;value&lt;/span&gt; != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;))
			{
				&lt;span style="color: #0000ff"&gt;value&lt;/span&gt;.Orders.Add(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;);
				&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;._CustomerID = &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;.CustomerID;
			}
			&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;
			{
				&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;._CustomerID = &lt;span style="color: #0000ff"&gt;default&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;);
			}
			&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.SendPropertyChanged("&lt;span style="color: #8b0000"&gt;Customer&lt;/span&gt;");
		}
	}
}&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;Both properties show exactly why I despise code generation as an architectural approach.&lt;/p&gt;
&lt;p&gt;Instead of taking the appropriate route, and actually solving the problem at hand, they just threw code at it until it looked like it worked.&lt;/p&gt;&lt;img src="http://ayende.com/Blog/aggbug/9952.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ayende Rahien</dc:creator>
            <guid>http://ayende.com/Blog/archive/2007/12/16/Well-just-codegen-our-way-out-of-here.aspx</guid>
            <pubDate>Sun, 16 Dec 2007 08:54:16 GMT</pubDate>
            <comments>http://ayende.com/Blog/archive/2007/12/16/Well-just-codegen-our-way-out-of-here.aspx#feedback</comments>
            <slash:comments>31</slash:comments>
            <wfw:commentRss>http://ayende.com/Blog/comments/commentRss/9952.aspx</wfw:commentRss>
        </item>
        <item>
            <title>RunSharp: Reflection Emit for Mere Mortals</title>
            <link>http://ayende.com/Blog/archive/2007/11/03/RunSharp-Reflection-Emit-for-Mere-Mortals.aspx</link>
            <description>&lt;p&gt;I have been dealing with IL generation using Reflection Emit for about two years. I believe that I have enough experience with it to get a feeling for how it goes, and it usually goes slowly and painfully. There are wrappers around it (Castle Dynamic Proxy has a AST for this), but they are fairly specialized, and anyone somehow I always find myself needing to fix the code that build the AST, mostly because I have users that throws weird curve balls at Rhino Mocks.&lt;/p&gt; &lt;p&gt;Nevertheless, IL generation is a powerful technique, just very cumbersome to deal with. &lt;a href="http://sourceforge.net/projects/runsharp"&gt;RunSharp&lt;/a&gt; is a OSS project that aims to solve this issue, it generate code on the fly, using high-level syntax.&lt;/p&gt; &lt;p&gt;This means that you can write code like this:&lt;/p&gt; &lt;blockquote&gt;&lt;pre&gt;g.Assign(x, o.Invoke("&lt;span style="color: #8b0000"&gt;MyMethod&lt;/span&gt;", arg1, arg2));
g.Assign(y, o.Property("&lt;span style="color: #8b0000"&gt;MyProperty&lt;/span&gt;"));
g.Assign(o.Property("&lt;span style="color: #8b0000"&gt;MyProperty&lt;/span&gt;"), z);
g.Assign(f, o.Field("&lt;span style="color: #8b0000"&gt;myField&lt;/span&gt;"));&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;And it will generate the appropriate:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre&gt;x = o.MyMethod(arg1, arg2);
y = o.MyProperty;
o.MyProperty = z;
f = o.myField;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;I am &lt;em&gt;impressed&lt;/em&gt;, if this works, it can mean some very interesting possibilities. I took a very brief glance at the code, and it is using the ILGenerator from the framework, I would be very interested in getting this to work on (a) dynamic methods, (b) cecil.&lt;/p&gt;
&lt;p&gt;The license is GPL, however, which means that it is a problem to use in any scenario. In my opinion, such a thing should be LGPL, which would allow its use in other projects, but that is a subject for another day.&lt;/p&gt;
&lt;p&gt;Thanks &lt;a href="http://weblogs.asp.net/rosherove/archive/2007/11/02/debugger-visualizers-for-methodinfo-dynamicmethod-and-methodbase.aspx"&gt;Roy&lt;/a&gt;, for finding it.&lt;/p&gt;&lt;img src="http://ayende.com/Blog/aggbug/9833.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ayende Rahien</dc:creator>
            <guid>http://ayende.com/Blog/archive/2007/11/03/RunSharp-Reflection-Emit-for-Mere-Mortals.aspx</guid>
            <pubDate>Sat, 03 Nov 2007 03:50:21 GMT</pubDate>
            <comments>http://ayende.com/Blog/archive/2007/11/03/RunSharp-Reflection-Emit-for-Mere-Mortals.aspx#feedback</comments>
            <slash:comments>4</slash:comments>
            <wfw:commentRss>http://ayende.com/Blog/comments/commentRss/9833.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Dynamic Methods</title>
            <link>http://ayende.com/Blog/archive/2007/10/29/Dynamic-Methods.aspx</link>
            <description>&lt;p&gt;I don't hear it talked about, but the CLR has a very efficient way to generate code at runtime. Probably this is because this code generation stuff is something that is accessible through IL generation only, and that is not for the faint of heart. Nevertheless, there are some very useful uses for this. NHibernate is utilizing this approach to avoid the costs of reflection, for instance.&lt;/p&gt; &lt;p&gt;Let us take a look about a simple scenario, we want to translate any delegate type with two parameters to a call to an instance method on our class:&lt;/p&gt; &lt;blockquote&gt;&lt;pre&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Program
{
	&lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Main(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;[] args)
	{
		&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Program().Execute();
	}

	&lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Execute()
	{
		&lt;span style="color: #008000"&gt;//instance that has events that we want to subscribe the adapter to &lt;/span&gt;
		DataGridView dataGridView1 = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; DataGridView();
		EventInfo ei = dataGridView1.GetType().GetEvent("&lt;span style="color: #8b0000"&gt;RowPrePaint&lt;/span&gt;");

		ParameterInfo[]pia = ei.EventHandlerType.GetMethod("&lt;span style="color: #8b0000"&gt;Invoke&lt;/span&gt;").GetParameters();

		MethodInfo methodInfo = &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.GetType().GetMethod("&lt;span style="color: #8b0000"&gt;Handler&lt;/span&gt;", 
			&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Type[]{&lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;), &lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;)});

		DynamicMethod mtd = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; DynamicMethod(
			"&lt;span style="color: #8b0000"&gt;Adapter&lt;/span&gt;",
			&lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;),
			&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Type[]
				{
					&lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt; (Program), &lt;span style="color: #008000"&gt;// this &lt;/span&gt;
					pia[0].ParameterType,&lt;span style="color: #008000"&gt;// sender&lt;/span&gt;
					pia[1].ParameterType &lt;span style="color: #008000"&gt;// e&lt;/span&gt;
				}, &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.GetType(), &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;);

		ILGenerator gtr = mtd.GetILGenerator();
		gtr.Emit(OpCodes.Ldarg_0); &lt;span style="color: #008000"&gt;// this&lt;/span&gt;
		gtr.Emit(OpCodes.Ldarg_1); &lt;span style="color: #008000"&gt;// sender&lt;/span&gt;
		gtr.Emit(OpCodes.Ldarg_2); &lt;span style="color: #008000"&gt;// e&lt;/span&gt;
		gtr.Emit(OpCodes.Call, methodInfo);
		gtr.Emit(OpCodes.Ret);

		&lt;span style="color: #008000"&gt;// generate a delegate bound to this object instance&lt;/span&gt;
		Delegate dynamicDelegate = mtd.CreateDelegate(&lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(DataGridViewRowPrePaintEventHandler), &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;);
		&lt;span style="color: #008000"&gt;//register the adapter&lt;/span&gt;
		ei.AddEventHandler(dataGridView1, dynamicDelegate);


		dataGridView1.GetType().GetMethod("&lt;span style="color: #8b0000"&gt;OnRowPrePaint&lt;/span&gt;", BindingFlags.NonPublic | BindingFlags.Instance)
			.Invoke(dataGridView1, &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; &lt;span style="color: #0000ff"&gt;object&lt;/span&gt;[] { &lt;span style="color: #0000ff"&gt;null&lt;/span&gt; });
	}

	&lt;span style="color: #008000"&gt;// method that handles the call&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Handler(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; x, &lt;span style="color: #0000ff"&gt;object&lt;/span&gt; y)
	{
		Console.WriteLine("&lt;span style="color: #8b0000"&gt;{0}: {1}, {2}&lt;/span&gt;", &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.GetHashCode(), x, y);
	}
}&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;Take into account that you are probably going to want to cache the method anyway, but this is a cool, if long winded way of achieving this. Personally, in this scenario I would probably simply write a reflection based wrapper, the complexity doesn't really have justification in such a case, but this is just an example, of course.&lt;/p&gt;&lt;img src="http://ayende.com/Blog/aggbug/9824.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ayende Rahien</dc:creator>
            <guid>http://ayende.com/Blog/archive/2007/10/29/Dynamic-Methods.aspx</guid>
            <pubDate>Mon, 29 Oct 2007 20:07:48 GMT</pubDate>
            <comments>http://ayende.com/Blog/archive/2007/10/29/Dynamic-Methods.aspx#feedback</comments>
            <slash:comments>12</slash:comments>
            <wfw:commentRss>http://ayende.com/Blog/comments/commentRss/9824.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Working with ANTLR: HQL Grammar</title>
            <link>http://ayende.com/Blog/archive/2007/08/11/Working-with-ANTLR-HQL-Grammar.aspx</link>
            <description>&lt;p&gt;I am currently trying to build an ANTLR grammar for HQL. There is already an existing one for Hibernate 3, but that one is based on ANLTR 2.x and supports quite a bit more than NHibernate does at the moment (DML statements, for instance). After several failed attempts to port the grammar to ANTLR 3 and generate C# code out of it, I gave up and started building my own.&lt;/p&gt; &lt;p&gt;I have read the ANTLR book not that long ago, so I ought to have a known what was in store for me. I didn't. I found out that this require a totally different mode of thinking. My recursion muscle is very tired at the moment, but I managed to create a simple grammar for:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;select x.y, z.b from Entity as e join e.Children as c&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;I kept having false starts with the thing, until I went and read Boo's source, and figure out how Boo's parser works. Basically, instead of letting the tool to generate the parser and work of the generated tree, this approach calls for constructing our own tree while we parse the source.&lt;/p&gt; &lt;p&gt;&lt;a href="http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/WorkingwithANTLRHQLGrammar_5AC8/image_1.png" atomicselection="true"&gt;&lt;img height="374" alt="image" src="http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/WorkingwithANTLRHQLGrammar_5AC8/image_thumb_1.png" width="683" border="0" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;As you can see, we constantly pass the Query instance down to lower rules, so we can operate on it and build our tree. This is much easier than trying to handle the CommonTreeAdaptor [sic] and derivatives.&lt;/p&gt; &lt;p&gt;I want to make the parser and the resulting AST as smart as possible, before trying to plug it into NHibernate's itself. That is going to be a significant undertaking, and I would like to have help, so feel free to contribute.  &lt;/p&gt; &lt;p&gt;Now that I have the initial stuff going, I am going to refactor it a bit to match this BNF (&lt;a title="http://www.hibernate.org/89.html" href="http://www.hibernate.org/89.html"&gt;http://www.hibernate.org/89.html&lt;/a&gt;), and yes, I know it is outdated.&lt;/p&gt; &lt;p&gt;There are about a dozen tests for the syntax yet, so it is possible to just grab it and start working on it.&lt;/p&gt; &lt;p&gt;You can grab the source from: &lt;a href="https://rhino-tools.svn.sourceforge.net/svnroot/rhino-tools/experiments/Hql"&gt;https://rhino-tools.svn.sourceforge.net/svnroot/rhino-tools/experiments/Hql&lt;/a&gt;&lt;/p&gt;&lt;img src="http://ayende.com/Blog/aggbug/9607.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ayende Rahien</dc:creator>
            <guid>http://ayende.com/Blog/archive/2007/08/11/Working-with-ANTLR-HQL-Grammar.aspx</guid>
            <pubDate>Sat, 11 Aug 2007 03:54:20 GMT</pubDate>
            <comments>http://ayende.com/Blog/archive/2007/08/11/Working-with-ANTLR-HQL-Grammar.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://ayende.com/Blog/comments/commentRss/9607.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Observations on Learning</title>
            <link>http://ayende.com/Blog/archive/2007/06/30/Observations-on-Learning.aspx</link>
            <description>&lt;p&gt;Here is an observation on learning. When I was at high school, I was thought Pascal, and I couldn't for the life of me understand dynamic memory allocation. I had little problem with everything else, but dynamic memory allocation (better known as pointers) was a mystery wrapped in an enigma stashed inside a headache.&lt;/p&gt; &lt;p&gt;About a year later, I was learning C++, and was one of the first in the class that grasped pointers and their usages. I remember trying to explain ***pppHead (sparse matrix) to another student, and he drew blank after the first level of indirection. I don't think that the quality of the teachers was that different,  and the material is basically the same, but I grokked the second and couldn't figure out the first.&lt;/p&gt; &lt;p&gt;I have run into this many times since, usually a piece of technology just doesn't make sense to me, and at one point, it clicks together, and it is "Oh, that is simple!"&lt;/p&gt; &lt;p&gt;For a while now, I have been feeling my lack of knowledge in the area of parsers, and I kept trying to learn ANTLR on my own. I got to the point where I could read EBNF fairly well, and actually make sense of it, but taking the next step to actually building a language has been beyond me. Yesterday I picked up &lt;a href="http://www.pragmaticprogrammer.com/title/tpantlr/"&gt;&lt;b&gt;The Definitive ANTLR Reference&lt;/b&gt;&lt;/a&gt;, and I have been going through it with a fairly rapid pace. I don't think that at my level, the book is offering something that isn't already available online, but I have been able to understand how things mesh together much better now.&lt;/p&gt; &lt;p&gt;I feel that now, I am not competent with parser building, it is certainly something that I can be with a reasonable amount of real world practice. In other words, I think that I am going to be able parsers and parser building to my toolbox.&lt;/p&gt;&lt;img src="http://ayende.com/Blog/aggbug/9516.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ayende Rahien</dc:creator>
            <guid>http://ayende.com/Blog/archive/2007/06/30/Observations-on-Learning.aspx</guid>
            <pubDate>Sat, 30 Jun 2007 20:11:42 GMT</pubDate>
            <comments>http://ayende.com/Blog/archive/2007/06/30/Observations-on-Learning.aspx#feedback</comments>
            <slash:comments>5</slash:comments>
            <wfw:commentRss>http://ayende.com/Blog/comments/commentRss/9516.aspx</wfw:commentRss>
        </item>
        <item>
            <title>What kind of persistence would Ayende write without OR/M?</title>
            <link>http://ayende.com/Blog/archive/2007/06/06/What-kind-of-persistence-would-Ayende-write-without-ORM.aspx</link>
            <description>&lt;p&gt;&lt;a href="http://blogs.codehaus.org/people/bamboo/"&gt;Rodrigo&lt;/a&gt; &lt;a href="http://blogs.codehaus.org/people/bamboo/archives/001586_domain_model_persistence_on_the_naked_clr.html"&gt;thinks&lt;/a&gt; that I am ignoring the obvious when I think about persistence only in terms of RDBMS. He is probably right.&lt;/p&gt; &lt;p&gt;I want to point out that the last time I wanted to have a non-DB persistence, I used &lt;a href="http://www.ayende.com/Blog/archive/7754.aspx"&gt;C# as the file format&lt;/a&gt;. That was fairly successful, although I will probably won't do it again.&lt;/p&gt;&lt;img src="http://ayende.com/Blog/aggbug/9410.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ayende Rahien</dc:creator>
            <guid>http://ayende.com/Blog/archive/2007/06/06/What-kind-of-persistence-would-Ayende-write-without-ORM.aspx</guid>
            <pubDate>Wed, 06 Jun 2007 18:56:56 GMT</pubDate>
            <comments>http://ayende.com/Blog/archive/2007/06/06/What-kind-of-persistence-would-Ayende-write-without-ORM.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://ayende.com/Blog/comments/commentRss/9410.aspx</wfw:commentRss>
        </item>
        <item>
            <title>NHibernate Query Generator - More Collections Magic</title>
            <link>http://ayende.com/Blog/archive/2007/06/05/NHibernate-Query-Generator--More-Collections-Magic.aspx</link>
            <description>&lt;p&gt;I wouldn't have expected it to be &lt;em&gt;this&lt;/em&gt; hard*, but it is alive!&lt;/p&gt; &lt;p&gt;Here is the query:&lt;/p&gt; &lt;div class="CodeFormatContainer"&gt; &lt;style&gt;&lt;!--
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }

--&gt;&lt;/style&gt;  &lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;User one = User.FindOne(&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;       Where.User.Blogs&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;            .With(JoinType.InnerJoin)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;                 .Name == &lt;span class="str"&gt;"Ayende @ Blog"&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;);&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;And the generated SQL:&lt;/p&gt;
&lt;div class="CodeFormatContainer"&gt;
&lt;style&gt;&lt;!--
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }

--&gt;&lt;/style&gt;

&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;font color="#0000ff"&gt;SELECT&lt;/font&gt; &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;   this_.Id &lt;span class="kwrd"&gt;as&lt;/span&gt; Id4_1_,&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;   this_.Name &lt;span class="kwrd"&gt;as&lt;/span&gt; Name4_1_,&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;   this_.Email &lt;span class="kwrd"&gt;as&lt;/span&gt; Email4_1_,&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;   blog1_.Id &lt;span class="kwrd"&gt;as&lt;/span&gt; Id3_0_,&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;   blog1_.Name &lt;span class="kwrd"&gt;as&lt;/span&gt; Name3_0_,&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;   blog1_.Author &lt;span class="kwrd"&gt;as&lt;/span&gt; Author3_0_ &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;&lt;font color="#0000ff"&gt;FROM&lt;/font&gt; Users this_ inner join Blogs blog1_ &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;   on this_.Id=blog1_.Author &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;&lt;font color="#0000ff"&gt;WHERE&lt;/font&gt; blog1_.Name = @p0&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;And, because Rob has asked, here is how you do a more complex query, over Many To Many association:&lt;/p&gt;
&lt;div class="CodeFormatContainer"&gt;
&lt;style&gt;&lt;!--
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }

--&gt;&lt;/style&gt;

&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;User one = User.FindOne(&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;    Where.User.Name == &lt;span class="str"&gt;"Ayende"&lt;/span&gt; &amp;amp;&amp;amp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    Where.User.Roles.With().Name == &lt;span class="str"&gt;"Administrator"&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;);&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;And the generated SQL:&lt;/p&gt;
&lt;div class="CodeFormatContainer"&gt;
&lt;style&gt;&lt;!--
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }

--&gt;&lt;/style&gt;

&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;SELECT this_.Id &lt;span class="kwrd"&gt;as&lt;/span&gt; Id0_1_,&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;   this_.Name &lt;span class="kwrd"&gt;as&lt;/span&gt; Name0_1_,&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;   this_.Email &lt;span class="kwrd"&gt;as&lt;/span&gt; Email0_1_,&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;   roles3_.UserId &lt;span class="kwrd"&gt;as&lt;/span&gt; UserId__,&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;   role1_.Id &lt;span class="kwrd"&gt;as&lt;/span&gt; RoleId,&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;   role1_.Id &lt;span class="kwrd"&gt;as&lt;/span&gt; Id9_0_,&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;   role1_.Name &lt;span class="kwrd"&gt;as&lt;/span&gt; Name9_0_ &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;FROM Users this_ inner join UsersRoles roles3_ &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;   on this_.Id=roles3_.UserId &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;      inner join Roles role1_ &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;         on roles3_.RoleId=role1_.Id &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;WHERE this_.Name = @p0 and role1_.Name = @p1&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;It is in the repository now, but right now I would consider it beta stage, it works, but the generation will probably die if you have any sort of interesting schemas (specifically, if you have collections of value types, it is supposed to die horribly with confusing error message).&lt;/p&gt;
&lt;p&gt;I intend to do a screen cast about this area of querying, searching and persistence soon.&lt;/p&gt;
&lt;p&gt;* Right now code generation competes with template magic and three stars code in my internal dislike list. Trying to get the sort of syntax that you see about is really stretching C# to its limits. When can I get a Method Missing implementation on C#? That would actually make my life &lt;em&gt;easier&lt;/em&gt;?&lt;/p&gt;&lt;img src="http://ayende.com/Blog/aggbug/9404.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ayende Rahien</dc:creator>
            <guid>http://ayende.com/Blog/archive/2007/06/05/NHibernate-Query-Generator--More-Collections-Magic.aspx</guid>
            <pubDate>Tue, 05 Jun 2007 20:53:06 GMT</pubDate>
            <comments>http://ayende.com/Blog/archive/2007/06/05/NHibernate-Query-Generator--More-Collections-Magic.aspx#feedback</comments>
            <slash:comments>10</slash:comments>
            <wfw:commentRss>http://ayende.com/Blog/comments/commentRss/9404.aspx</wfw:commentRss>
        </item>
        <item>
            <title>On the advantages of one off tools</title>
            <link>http://ayende.com/Blog/archive/2007/06/05/On-the-advantages-of-one-off-tools.aspx</link>
            <description>&lt;p&gt;I don't like general purpose code generation, but I am fan of &lt;a href="http://ayende.com/Blog/archive/2007/06/05/NHibernate-Query-Generator--Collection-querying.aspx"&gt;special purpose ones&lt;/a&gt;. The main reason that I don't like the general purpose ones is in my experience they have invariably fell into the "Generate code that I don't like" or "Requires too much futzing to get to work the way I want it." Part of it is related to the fact that I consider generated code as a maintainability concern as well, and I am very nervous about trying to do that.&lt;/p&gt; &lt;p&gt;Nevertheless, I do like code generation, I tend to write simple code-generators for a lot of purposes. In my current project, we have a lot of churn in database schema wise (add field, rebuild, get a new DB), but we also have all kinds of ETL process to and from the DB, so that makes life more interesting. I wrote a code generator based on SMO that reads the DB schema after NHibernate generates it, and basically handles ~85% of the ETL process mess.&lt;/p&gt; &lt;p&gt;The nice thing about doing a one off tool is that I can make a &lt;em&gt;lot&lt;/em&gt; of assumptions about the structure that I will be using (all tables has PK named Id, for instances) that a general purpose tool cannot make.&lt;/p&gt;&lt;img src="http://ayende.com/Blog/aggbug/9400.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ayende Rahien</dc:creator>
            <guid>http://ayende.com/Blog/archive/2007/06/05/On-the-advantages-of-one-off-tools.aspx</guid>
            <pubDate>Mon, 04 Jun 2007 22:54:14 GMT</pubDate>
            <comments>http://ayende.com/Blog/archive/2007/06/05/On-the-advantages-of-one-off-tools.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://ayende.com/Blog/comments/commentRss/9400.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Dynamic Language Runtime on top of the CLR: This Is BIG</title>
            <link>http://ayende.com/Blog/archive/2007/04/30/Dynamic-Language-Runtime-on-top-of-the-CLR-This-Is.aspx</link>
            <description>&lt;p&gt;    Check &lt;a href="http://blogs.msdn.com/hugunin/archive/2007/04/30/a-dynamic-language-runtime-dlr.aspx"&gt;this out&lt;/a&gt;. Even though that Jim says that it is on the IronPython site, I &lt;a href="http://www.codeplex.com/IronPython/SourceControl/DirectoryView.aspx?SourcePath=%24%2fIronPython%2fIronPython_1_1%2fSrc&amp;amp;changeSetId=21805"&gt;can't find it&lt;/a&gt;, but I am still loving it. Making the CLR more friendly to dynamic languages is a Good Thing in general, but the thing that excites me is the possiblity that it can be leveraged from my code as well.&lt;/p&gt;&lt;p&gt;    I paid my IL taxes, and while Linq expressions are nice, I would like to get solid support for runtime code generation without having to do it in the assembly level. &lt;/p&gt;&lt;img src="http://ayende.com/Blog/aggbug/9246.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ayende Rahien</dc:creator>
            <guid>http://ayende.com/Blog/archive/2007/04/30/Dynamic-Language-Runtime-on-top-of-the-CLR-This-Is.aspx</guid>
            <pubDate>Mon, 30 Apr 2007 20:33:32 GMT</pubDate>
            <comments>http://ayende.com/Blog/archive/2007/04/30/Dynamic-Language-Runtime-on-top-of-the-CLR-This-Is.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://ayende.com/Blog/comments/commentRss/9246.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Quick &amp; Dirty CodeGen</title>
            <link>http://ayende.com/Blog/archive/2007/04/15/Quick--Dirty-CodeGen.aspx</link>
            <description>&lt;p&gt;    I needed to get some code that would map an XML file to a database table. Not being particularily fond of doing it by hand, I whipped out this statement:&lt;/p&gt;&lt;div style="BORDER-RIGHT: #999999 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: #999999 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; BORDER-LEFT: #999999 1px solid; WIDTH: 100%; PADDING-TOP: 4px; BORDER-BOTTOM: #999999 1px solid; BACKGROUND-COLOR: #ffffe1"&gt;    &lt;p class="MsoNormal" dir="ltr" style="MARGIN: 0cm 0cm 0pt; DIRECTION: ltr; LINE-HEIGHT: normal; unicode-bidi: embed; TEXT-ALIGN: left; mso-layout-grid-align: none"&gt;        &lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;select&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;&lt;span style="COLOR: red"&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?&gt;'&lt;o:p&gt;&lt;/o:p&gt;        &lt;/span&gt;&lt;/span&gt;    &lt;/p&gt;    &lt;p class="MsoNormal" dir="ltr" style="MARGIN: 0cm 0cm 0pt; DIRECTION: ltr; LINE-HEIGHT: normal; unicode-bidi: embed; TEXT-ALIGN: left; mso-layout-grid-align: none"&gt;        &lt;span style="FONT-SIZE: 10pt; COLOR: red; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-tab-count: 1"&gt;      &lt;/span&gt;if node.SelectSingleNode("'&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt; &lt;span style="COLOR: gray"&gt;+&lt;/span&gt; column_name &lt;span style="COLOR: gray"&gt;+&lt;/span&gt; &lt;span style="COLOR: red"&gt;'/text()") is not null:&lt;o:p&gt;&lt;/o:p&gt;        &lt;/span&gt;&lt;/span&gt;    &lt;/p&gt;    &lt;p class="MsoNormal" dir="ltr" style="MARGIN: 0cm 0cm 0pt; DIRECTION: ltr; LINE-HEIGHT: normal; unicode-bidi: embed; TEXT-ALIGN: left; mso-layout-grid-align: none"&gt;        &lt;span style="FONT-SIZE: 10pt; COLOR: red; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-tab-count: 2"&gt;            &lt;/span&gt;row["'&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt; &lt;span style="COLOR: gray"&gt;+&lt;/span&gt; column_name &lt;span style="COLOR: gray"&gt;+&lt;/span&gt; &lt;span style="COLOR: red"&gt;'"] = node.SelectSingleNode("'&lt;/span&gt; &lt;span style="COLOR: gray"&gt;+&lt;/span&gt; column_name &lt;span style="COLOR: gray"&gt;+&lt;/span&gt; &lt;span style="COLOR: red"&gt;'/text()").Value         &lt;o:p&gt;&lt;/o:p&gt;        &lt;/span&gt;&lt;/span&gt;    &lt;/p&gt;    &lt;p class="MsoNormal" dir="ltr" style="MARGIN: 0cm 0cm 0pt; DIRECTION: ltr; LINE-HEIGHT: normal; unicode-bidi: embed; TEXT-ALIGN: left; mso-layout-grid-align: none"&gt;        &lt;span style="FONT-SIZE: 10pt; COLOR: red; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-tab-count: 1"&gt;      &lt;/span&gt;else:&lt;o:p&gt;&lt;/o:p&gt;        &lt;/span&gt;    &lt;/p&gt;    &lt;p class="MsoNormal" dir="ltr" style="MARGIN: 0cm 0cm 0pt; DIRECTION: ltr; LINE-HEIGHT: normal; unicode-bidi: embed; TEXT-ALIGN: left; mso-layout-grid-align: none"&gt;        &lt;span style="FONT-SIZE: 10pt; COLOR: red; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-tab-count: 2"&gt;            &lt;/span&gt;row["'&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt; &lt;span style="COLOR: gray"&gt;+&lt;/span&gt; column_name &lt;span style="COLOR: gray"&gt;+&lt;/span&gt; &lt;span style="COLOR: red"&gt;'"] = DBNull.Value'&lt;o:p&gt;&lt;/o:p&gt;        &lt;/span&gt;&lt;/span&gt;    &lt;/p&gt;    &lt;p class="MsoNormal" dir="ltr" style="MARGIN: 0cm 0cm 0pt; DIRECTION: ltr; LINE-HEIGHT: normal; unicode-bidi: embed; TEXT-ALIGN: left; mso-layout-grid-align: none"&gt;        &lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;from&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;    &lt;/span&gt;&lt;span style="COLOR: green"&gt;information_schema.columns&lt;o:p&gt;&lt;/o:p&gt;        &lt;/span&gt;&lt;/span&gt;    &lt;/p&gt;    &lt;p class="MsoNormal" dir="ltr" style="MARGIN: 0cm 0cm 10pt; DIRECTION: ltr; unicode-bidi: embed; TEXT-ALIGN: left"&gt;        &lt;span style="FONT-SIZE: 10pt; COLOR: blue; LINE-HEIGHT: 115%; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;where&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;   &lt;/span&gt;table_name &lt;span style="COLOR: gray"&gt;=&lt;/span&gt; &lt;span style="COLOR: red"&gt;'Content'&lt;/span&gt;&lt;/span&gt;    &lt;/p&gt;&lt;/div&gt;&lt;p&gt;    I am doing about 60% of my code gen with SQL and Regex, I think.&lt;/p&gt;&lt;img src="http://ayende.com/Blog/aggbug/9212.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ayende Rahien</dc:creator>
            <guid>http://ayende.com/Blog/archive/2007/04/15/Quick--Dirty-CodeGen.aspx</guid>
            <pubDate>Sun, 15 Apr 2007 06:11:23 GMT</pubDate>
            <comments>http://ayende.com/Blog/archive/2007/04/15/Quick--Dirty-CodeGen.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://ayende.com/Blog/comments/commentRss/9212.aspx</wfw:commentRss>
        </item>
    </channel>
</rss>