diff --git a/maud_macros/src/parse.rs b/maud_macros/src/parse.rs
index b6743ea..7250698 100644
--- a/maud_macros/src/parse.rs
+++ b/maud_macros/src/parse.rs
@@ -48,10 +48,10 @@ pub fn parse(cx: &ExtCtxt, input: &[TokenTree], sp: Span) -> P<Expr> {
         in_attr: false,
         input: input,
         span: sp,
-        render: Renderer::new(cx, write.to_vec()),
+        render: Renderer::new(cx),
     };
     parser.markups();
-    parser.into_render().into_expr()
+    parser.into_render().into_expr(write.to_vec())
 }
 
 fn split_comma<'a>(cx: &ExtCtxt, input: &'a [TokenTree], sp: Span) -> (&'a [TokenTree], &'a [TokenTree]) {
diff --git a/maud_macros/src/render.rs b/maud_macros/src/render.rs
index e209f3d..b7eee1a 100644
--- a/maud_macros/src/render.rs
+++ b/maud_macros/src/render.rs
@@ -23,17 +23,16 @@ pub struct Renderer<'cx> {
 
 impl<'cx> Renderer<'cx> {
     /// Creates a new `Renderer` using the given extension context.
-    pub fn new(cx: &'cx ExtCtxt<'cx>, writer_expr: Vec<TokenTree>) -> Renderer<'cx> {
+    pub fn new(cx: &'cx ExtCtxt<'cx>) -> Renderer<'cx> {
         let writer = token::gensym_ident("__maud_writer");
         let result = token::gensym_ident("__maud_result");
         let loop_label = token::gensym_ident("__maud_loop_label");
-        let writer_stmt = quote_stmt!(cx, let $writer = &mut $writer_expr).unwrap();
         Renderer {
             cx: cx,
             writer: writer,
             result: result,
             loop_label: vec![TtToken(DUMMY_SP, token::Lifetime(loop_label))],
-            stmts: vec![writer_stmt],
+            stmts: vec![],
             tail: String::new(),
         }
     }
@@ -65,13 +64,15 @@ impl<'cx> Renderer<'cx> {
     }
 
     /// Reifies the `Renderer` into a block of markup.
-    pub fn into_expr(mut self) -> P<Expr> {
-        let Renderer { cx, result, loop_label, stmts, .. } = { self.flush(); self };
+    pub fn into_expr(mut self, writer_expr: Vec<TokenTree>) -> P<Expr> {
+        let Renderer { cx, writer, result, loop_label, stmts, .. } = { self.flush(); self };
         quote_expr!(cx, {
             let mut $result = Ok(());
             $loop_label: loop {
                 use ::std::fmt::Write;
-                $stmts
+                match &mut $writer_expr {
+                    $writer => { $stmts }
+                }
                 break $loop_label;
             }
             $result