diff --git a/maud_macros/src/parse.rs b/maud_macros/src/parse.rs
index 0825f3d..68f6003 100644
--- a/maud_macros/src/parse.rs
+++ b/maud_macros/src/parse.rs
@@ -152,6 +152,12 @@ impl<'cx, 'i> Parser<'cx, 'i> {
                 self.shift(2);
                 try!(self.for_expr(sp));
             },
+            // Call
+            [pound!(), ident!(sp, name), ..] if name.name == "call" => {
+                self.shift(2);
+                let func = try!(self.splice(sp));
+                self.render.emit_call(func);
+            },
             // Splice
             [ref tt @ dollar!(), dollar!(), ..] => {
                 self.shift(2);
diff --git a/maud_macros/src/render.rs b/maud_macros/src/render.rs
index a4f0f11..36add0e 100644
--- a/maud_macros/src/render.rs
+++ b/maud_macros/src/render.rs
@@ -190,6 +190,13 @@ impl<'cx> Renderer<'cx> {
         let stmt = quote_stmt!(self.cx, for $pattern in $iterable { $body }).unwrap();
         self.push(stmt);
     }
+
+    pub fn emit_call(&mut self, func: P<Expr>) {
+        let w = self.writer;
+        let expr = quote_expr!(self.cx, ($func)(&mut *$w));
+        let stmt = self.wrap_try(expr);
+        self.push(stmt);
+    }
 }
 
 fn html_escape(s: &str) -> String {
diff --git a/maud_macros/tests/tests.rs b/maud_macros/tests/tests.rs
index 3950b5f..cbbb8d6 100644
--- a/maud_macros/tests/tests.rs
+++ b/maud_macros/tests/tests.rs
@@ -3,6 +3,8 @@
 
 extern crate maud;
 
+use std::fmt;
+
 #[test]
 fn literals() {
     let mut s = String::new();
@@ -271,3 +273,23 @@ mod issue_10 {
         assert_eq!(s, r#"<this sentence-is="false" of-course></this>"#);
     }
 }
+
+#[test]
+fn call() {
+    fn ducks(w: &mut fmt::Write) -> fmt::Result {
+        write!(w, "Ducks")
+    }
+    let mut s = String::new();
+    let swans = |yes|
+        if yes {
+            |w: &mut fmt::Write| write!(w, "Swans")
+        } else {
+            panic!("oh noes")
+        };
+    html!(s, {
+        #call ducks
+        #call (|w: &mut fmt::Write| write!(w, "Geese"))
+        #call swans(true)
+    }).unwrap();
+    assert_eq!(s, "DucksGeeseSwans");
+}