Inline closure capture and binding mode
diff --git a/src/expr.rs b/src/expr.rs
index b20af26..2213966 100644
--- a/src/expr.rs
+++ b/src/expr.rs
@@ -191,7 +191,7 @@
         /// A closure (for example, `move |a, b, c| a + b + c`)
         pub Closure(ExprClosure #full {
             pub attrs: Vec<Attribute>,
-            pub capture: CaptureBy,
+            pub capture: Option<Token![move]>,
             pub or1_token: Token![|],
             pub inputs: Delimited<FnArg, Token![,]>,
             pub or2_token: Token![|],
@@ -573,7 +573,8 @@
         /// field must be `None`). Disambiguation cannot be done with parser alone, so it happens
         /// during name resolution.
         pub Ident(PatIdent {
-            pub mode: BindingMode,
+            pub mode: Option<Token![ref]>,
+            pub mutability: Mutability,
             pub ident: Ident,
             pub at_token: Option<Token![@]>,
             pub subpat: Option<Box<Pat>>,
@@ -681,16 +682,6 @@
 
 #[cfg(feature = "full")]
 ast_enum! {
-    /// A capture clause
-    #[cfg_attr(feature = "clone-impls", derive(Copy))]
-    pub enum CaptureBy {
-        Value(Token![move]),
-        Ref,
-    }
-}
-
-#[cfg(feature = "full")]
-ast_enum! {
     /// Limit types of a range (inclusive or exclusive)
     #[cfg_attr(feature = "clone-impls", derive(Copy))]
     pub enum RangeLimits {
@@ -718,15 +709,6 @@
     }
 }
 
-#[cfg(feature = "full")]
-ast_enum! {
-    #[cfg_attr(feature = "clone-impls", derive(Copy))]
-    pub enum BindingMode {
-        ByRef(Token![ref], Mutability),
-        ByValue(Mutability),
-    }
-}
-
 #[cfg(any(feature = "parsing", feature = "printing"))]
 #[cfg(feature = "full")]
 fn arm_expr_requires_comma(expr: &Expr) -> bool {
@@ -1648,7 +1630,7 @@
 
     #[cfg(feature = "full")]
     named!(expr_closure(allow_struct: bool) -> Expr, do_parse!(
-        capture: syn!(CaptureBy) >>
+        capture: option!(keyword!(move)) >>
         or1: punct!(|) >>
         inputs: call!(Delimited::parse_terminated_with, fn_arg) >>
         or2: punct!(|) >>
@@ -2116,10 +2098,8 @@
             not!(punct!(::)) >>
             subpat: option!(tuple!(punct!(@), syn!(Pat))) >>
             (PatIdent {
-                mode: match mode {
-                    Some(mode) => BindingMode::ByRef(mode, mutability),
-                    None => BindingMode::ByValue(mutability),
-                },
+                mode: mode,
+                mutability: mutability,
                 ident: name,
                 at_token: subpat.as_ref().map(|p| Token![@]((p.0).0)),
                 subpat: subpat.map(|p| Box::new(p.1)),
@@ -2182,11 +2162,8 @@
                 ident: syn!(Ident) >>
                 ({
                     let mut pat: Pat = PatIdent {
-                        mode: if let Some(mode) = mode {
-                            BindingMode::ByRef(mode, mutability)
-                        } else {
-                            BindingMode::ByValue(mutability)
-                        },
+                        mode: mode,
+                        mutability: mutability,
                         ident: ident,
                         subpat: None,
                         at_token: None,
@@ -2379,15 +2356,6 @@
             }
         ));
     }
-
-    #[cfg(feature = "full")]
-    impl Synom for CaptureBy {
-        named!(parse -> Self, alt!(
-            keyword!(move) => { CaptureBy::Value }
-            |
-            epsilon!() => { |_| CaptureBy::Ref }
-        ));
-    }
 }
 
 #[cfg(feature = "printing")]
@@ -2960,6 +2928,7 @@
     impl ToTokens for PatIdent {
         fn to_tokens(&self, tokens: &mut Tokens) {
             self.mode.to_tokens(tokens);
+            self.mutability.to_tokens(tokens);
             self.ident.to_tokens(tokens);
             if self.subpat.is_some() {
                 TokensOrDefault(&self.at_token).to_tokens(tokens);
@@ -3103,33 +3072,6 @@
     }
 
     #[cfg(feature = "full")]
-    impl ToTokens for BindingMode {
-        fn to_tokens(&self, tokens: &mut Tokens) {
-            match *self {
-                BindingMode::ByRef(ref t, ref m) => {
-                    t.to_tokens(tokens);
-                    m.to_tokens(tokens);
-                }
-                BindingMode::ByValue(ref m) => {
-                    m.to_tokens(tokens);
-                }
-            }
-        }
-    }
-
-    #[cfg(feature = "full")]
-    impl ToTokens for CaptureBy {
-        fn to_tokens(&self, tokens: &mut Tokens) {
-            match *self {
-                CaptureBy::Value(ref t) => t.to_tokens(tokens),
-                CaptureBy::Ref => {
-                    // nothing
-                }
-            }
-        }
-    }
-
-    #[cfg(feature = "full")]
     impl ToTokens for Block {
         fn to_tokens(&self, tokens: &mut Tokens) {
             self.brace_token.surround(tokens, |tokens| {