diff --git a/.gitignore b/.gitignore
index 0cdcda3..3042ecd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,5 @@
.rvmrc
-_site
\ No newline at end of file
+_site
+
+*.swp
+*.swo
diff --git a/authors.textile b/authors.textile
index 6a0895c..f6e75aa 100644
--- a/authors.textile
+++ b/authors.textile
@@ -13,6 +13,7 @@ _The following people are totally rad and awesome because they have contributed
* David Moulton _dave@themoultons.net_
* Sebastian Slomski _sebastian@simple-systems.org_
* Aaron Weinberger _aw9994@cs.ship.edu_
+* James C. Holder _cs_cookbook@thirdtruck.org_
* ...You! What are you waiting for? Check out the contributing section and get cracking!
diff --git a/chapters/design_patterns/builder.textile b/chapters/design_patterns/builder.textile
new file mode 100644
index 0000000..9fc8191
--- /dev/null
+++ b/chapters/design_patterns/builder.textile
@@ -0,0 +1,91 @@
+---
+layout: recipe
+title: Builder Pattern
+chapter: Design Patterns
+---
+
+h2. Problem
+
+You need to prepare a complicated, multi-part object, but you expect to do it more than once or with varying configurations.
+
+h2. Solution
+
+Create a Builder to encapsulate the object production process.
+
+The Todo.txt format provides an advanced but still plain-text method for maintaining lists of to-do items. Typing out each item by hand would provide exhausting and error-prone, however, so a TodoTxtBuilder class could save us the trouble:
+
+{% highlight coffeescript %}
+class TodoTxtBuilder
+ constructor: (defaultParameters={ }) ->
+ @date = new Date(defaultParameters.date) or new Date
+ @contexts = defaultParameters.contexts or [ ]
+ @projects = defaultParameters.projects or [ ]
+ @priority = defaultParameters.priority or undefined
+ newTodo: (description, parameters={ }) ->
+ date = (parameters.date and new Date(parameters.date)) or @date
+ contexts = @contexts.concat(parameters.contexts or [ ])
+ projects = @projects.concat(parameters.projects or [ ])
+ priorityLevel = parameters.priority or @priority
+ createdAt = [date.getFullYear(), date.getMonth()+1, date.getDate()].join("-")
+ contextNames = ("@#{context}" for context in contexts when context).join(" ")
+ projectNames = ("+#{project}" for project in projects when project).join(" ")
+ priority = if priorityLevel then "(#{priorityLevel})" else ""
+ todoParts = [priority, createdAt, description, contextNames, projectNames]
+ (part for part in todoParts when part.length > 0).join " "
+
+builder = new TodoTxtBuilder(date: "10/13/2011")
+
+builder.newTodo "Wash laundry"
+
+# => '2011-10-13 Wash laundry'
+
+workBuilder = new TodoTxtBuilder(date: "10/13/2011", contexts: ["work"])
+
+workBuilder.newTodo "Show the new design pattern to Lucy", contexts: ["desk", "xpSession"]
+
+# => '2011-10-13 Show the new design pattern to Lucy @work @desk @xpSession'
+
+workBuilder.newTodo "Remind Sean about the failing unit tests", contexts: ["meeting"], projects: ["compilerRefactor"], priority: 'A'
+
+# => '(A) 2011-10-13 Remind Sean about the failing unit tests @work @meeting +compilerRefactor'
+
+{% endhighlight %}
+
+h2. Discussion
+
+The TodoTxtBuilder class takes care of all the heavy lifting of text generation and lets the programmer focus on the unique elements of each to-do item. Additionally, a command line tool or GUI could plug into this code and still retain support for later, more advanced versions of the format with ease.
+
+h3. Pre-Construction
+
+Instead of creating a new instance of the needed object from scratch every time, we shift the burden to a separate object that we can then tweak during the object creation process.
+
+{% highlight coffeescript %}
+builder = new TodoTxtBuilder(date: "10/13/2011")
+
+builder.newTodo "Order new netbook"
+
+# => '2011-10-13 Order new netbook'
+
+builder.projects.push "summerVacation"
+
+builder.newTodo "Buy suntan lotion"
+
+# => '2011-10-13 Buy suntan lotion +summerVacation'
+
+builder.contexts.push "phone"
+
+builder.newTodo "Order tickets"
+
+# => '2011-10-13 Order tickets @phone +summerVacation'
+
+delete builder.contexts[0]
+
+builder.newTodo "Fill gas tank"
+
+# => '2011-10-13 Fill gas tank +summerVacation'
+{% endhighlight %}
+
+h3. Exercises
+* Expand the project- and context-tag generation code to filter out duplicate entries.
+** Some Todo.txt users like to insert project and context tags inside the description of their to-do items. Add code to identify these tags and filter them out of the end tags.
+
diff --git a/chapters/design_patterns/decorator.textile b/chapters/design_patterns/decorator.textile
new file mode 100644
index 0000000..89cee57
--- /dev/null
+++ b/chapters/design_patterns/decorator.textile
@@ -0,0 +1,93 @@
+---
+layout: recipe
+title: Decorator Pattern
+chapter: Design Patterns
+---
+
+h2. Problem
+
+You have a set of data that you need to process in multiple, possibly varying ways.
+
+h2. Solution
+
+Use the Decorator pattern in order to structure how you apply the changes.
+
+{% highlight coffeescript %}
+miniMarkdown = (line) ->
+ if match = line.match /^(#+)\s*(.*)$/
+ headerLevel = match[1].length
+ headerText = match[2]
+ "
#{line}
" + else + '' + +stripComments = (line) -> + line.replace /\s*\/\/.*$/, '' # Removes one-line, double-slash C-style comments + +TextProcessor = (@processors) -> + reducer: (existing, processor) -> + if processor + processor(existing or '') + else + existing + processLine: (text) -> + @processors.reduce @reducer, text + processString: (text) -> + (@processLine(line) for line in text.split("\n")).join("\n") + +exampleText = ''' + # A level 1 header + A regular line + // a comment + ## A level 2 header + A line // with a comment + ''' + +processor = new TextProcessor [stripComments, miniMarkdown] + +processor.processString exampleText + +# => "A regular line
\n\nA line
" +{% endhighlight %} + +h3. Results + +{% highlight html %} +A regular line
+ +A line
+{% endhighlight %} + +h2. Discussion + +The TextProcessor serves the role of Decorator by binding the individual, specialized text processors together. This frees up the miniMarkdown and stripComments components to focus on handling nothing but a single line of text. Future developers only have to write functions that return a string and add it to the array of processors. + +We can even modify the existing Decorator object on the fly: + +{% highlight coffeescript %} +smilies = + ':)' : "smile" + ':D' : "huge_grin" + ':(' : "frown" + ';)' : "wink" + +smilieExpander = (line) -> + if line + (line = line.replace symbol, "