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| {
diff --git a/src/gen/fold.rs b/src/gen/fold.rs
index 192cc6d..e623a0e 100644
--- a/src/gen/fold.rs
+++ b/src/gen/fold.rs
@@ -66,8 +66,6 @@
 
 fn fold_bin_op(&mut self, i: BinOp) -> BinOp { fold_bin_op(self, i) }
 # [ cfg ( feature = "full" ) ]
-fn fold_binding_mode(&mut self, i: BindingMode) -> BindingMode { fold_binding_mode(self, i) }
-# [ cfg ( feature = "full" ) ]
 fn fold_block(&mut self, i: Block) -> Block { fold_block(self, i) }
 
 fn fold_body(&mut self, i: Body) -> Body { fold_body(self, i) }
@@ -77,8 +75,6 @@
 fn fold_body_struct(&mut self, i: BodyStruct) -> BodyStruct { fold_body_struct(self, i) }
 
 fn fold_bound_lifetimes(&mut self, i: BoundLifetimes) -> BoundLifetimes { fold_bound_lifetimes(self, i) }
-# [ cfg ( feature = "full" ) ]
-fn fold_capture_by(&mut self, i: CaptureBy) -> CaptureBy { fold_capture_by(self, i) }
 
 fn fold_const_param(&mut self, i: ConstParam) -> ConstParam { fold_const_param(self, i) }
 # [ cfg ( feature = "full" ) ]
@@ -683,23 +679,6 @@
     }
 }
 # [ cfg ( feature = "full" ) ]
-pub fn fold_binding_mode<V: Folder + ?Sized>(_visitor: &mut V, _i: BindingMode) -> BindingMode {
-    use ::BindingMode::*;
-    match _i {
-        ByRef(_binding_0, _binding_1, ) => {
-            ByRef (
-                Token ! [ ref ](tokens_helper(_visitor, &(_binding_0).0)),
-                _visitor.fold_mutability(_binding_1),
-            )
-        }
-        ByValue(_binding_0, ) => {
-            ByValue (
-                _visitor.fold_mutability(_binding_0),
-            )
-        }
-    }
-}
-# [ cfg ( feature = "full" ) ]
 pub fn fold_block<V: Folder + ?Sized>(_visitor: &mut V, _i: Block) -> Block {
     Block {
         brace_token: Brace(tokens_helper(_visitor, &(_i . brace_token).0)),
@@ -747,18 +726,6 @@
         gt_token: Token ! [ > ](tokens_helper(_visitor, &(_i . gt_token).0)),
     }
 }
-# [ cfg ( feature = "full" ) ]
-pub fn fold_capture_by<V: Folder + ?Sized>(_visitor: &mut V, _i: CaptureBy) -> CaptureBy {
-    use ::CaptureBy::*;
-    match _i {
-        Value(_binding_0, ) => {
-            Value (
-                Token ! [ move ](tokens_helper(_visitor, &(_binding_0).0)),
-            )
-        }
-        Ref => { Ref }
-    }
-}
 
 pub fn fold_const_param<V: Folder + ?Sized>(_visitor: &mut V, _i: ConstParam) -> ConstParam {
     ConstParam {
@@ -1105,7 +1072,7 @@
 pub fn fold_expr_closure<V: Folder + ?Sized>(_visitor: &mut V, _i: ExprClosure) -> ExprClosure {
     ExprClosure {
         attrs: FoldHelper::lift(_i . attrs, |it| { _visitor.fold_attribute(it) }),
-        capture: _visitor.fold_capture_by(_i . capture),
+        capture: (_i . capture).map(|it| { Token ! [ move ](tokens_helper(_visitor, &(it).0)) }),
         or1_token: Token ! [ | ](tokens_helper(_visitor, &(_i . or1_token).0)),
         inputs: FoldHelper::lift(_i . inputs, |it| { _visitor.fold_fn_arg(it) }),
         or2_token: Token ! [ | ](tokens_helper(_visitor, &(_i . or2_token).0)),
@@ -2188,7 +2155,8 @@
 # [ cfg ( feature = "full" ) ]
 pub fn fold_pat_ident<V: Folder + ?Sized>(_visitor: &mut V, _i: PatIdent) -> PatIdent {
     PatIdent {
-        mode: _visitor.fold_binding_mode(_i . mode),
+        mode: (_i . mode).map(|it| { Token ! [ ref ](tokens_helper(_visitor, &(it).0)) }),
+        mutability: _visitor.fold_mutability(_i . mutability),
         ident: _visitor.fold_ident(_i . ident),
         at_token: (_i . at_token).map(|it| { Token ! [ @ ](tokens_helper(_visitor, &(it).0)) }),
         subpat: (_i . subpat).map(|it| { Box::new(_visitor.fold_pat(* it)) }),
diff --git a/src/gen/visit.rs b/src/gen/visit.rs
index 891eeaa..bf8739e 100644
--- a/src/gen/visit.rs
+++ b/src/gen/visit.rs
@@ -62,8 +62,6 @@
 
 fn visit_bin_op(&mut self, i: &'ast BinOp) { visit_bin_op(self, i) }
 # [ cfg ( feature = "full" ) ]
-fn visit_binding_mode(&mut self, i: &'ast BindingMode) { visit_binding_mode(self, i) }
-# [ cfg ( feature = "full" ) ]
 fn visit_block(&mut self, i: &'ast Block) { visit_block(self, i) }
 
 fn visit_body(&mut self, i: &'ast Body) { visit_body(self, i) }
@@ -73,8 +71,6 @@
 fn visit_body_struct(&mut self, i: &'ast BodyStruct) { visit_body_struct(self, i) }
 
 fn visit_bound_lifetimes(&mut self, i: &'ast BoundLifetimes) { visit_bound_lifetimes(self, i) }
-# [ cfg ( feature = "full" ) ]
-fn visit_capture_by(&mut self, i: &'ast CaptureBy) { visit_capture_by(self, i) }
 
 fn visit_const_param(&mut self, i: &'ast ConstParam) { visit_const_param(self, i) }
 # [ cfg ( feature = "full" ) ]
@@ -587,19 +583,6 @@
     }
 }
 # [ cfg ( feature = "full" ) ]
-pub fn visit_binding_mode<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast BindingMode) {
-    use ::BindingMode::*;
-    match *_i {
-        ByRef(ref _binding_0, ref _binding_1, ) => {
-            tokens_helper(_visitor, &(_binding_0).0);
-            _visitor.visit_mutability(_binding_1);
-        }
-        ByValue(ref _binding_0, ) => {
-            _visitor.visit_mutability(_binding_0);
-        }
-    }
-}
-# [ cfg ( feature = "full" ) ]
 pub fn visit_block<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast Block) {
     tokens_helper(_visitor, &(& _i . brace_token).0);
     for it in & _i . stmts { _visitor.visit_stmt(it) };
@@ -635,16 +618,6 @@
     for el in & _i . lifetimes { let it = el.item(); _visitor.visit_lifetime_def(it) };
     tokens_helper(_visitor, &(& _i . gt_token).0);
 }
-# [ cfg ( feature = "full" ) ]
-pub fn visit_capture_by<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast CaptureBy) {
-    use ::CaptureBy::*;
-    match *_i {
-        Value(ref _binding_0, ) => {
-            tokens_helper(_visitor, &(_binding_0).0);
-        }
-        Ref => { }
-    }
-}
 
 pub fn visit_const_param<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast ConstParam) {
     for it in & _i . attrs { _visitor.visit_attribute(it) };
@@ -882,7 +855,7 @@
 # [ cfg ( feature = "full" ) ]
 pub fn visit_expr_closure<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast ExprClosure) {
     for it in & _i . attrs { _visitor.visit_attribute(it) };
-    _visitor.visit_capture_by(& _i . capture);
+    if let Some(ref it) = _i . capture { tokens_helper(_visitor, &(it).0) };
     tokens_helper(_visitor, &(& _i . or1_token).0);
     for el in & _i . inputs { let it = el.item(); _visitor.visit_fn_arg(it) };
     tokens_helper(_visitor, &(& _i . or2_token).0);
@@ -1721,7 +1694,8 @@
 }
 # [ cfg ( feature = "full" ) ]
 pub fn visit_pat_ident<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast PatIdent) {
-    _visitor.visit_binding_mode(& _i . mode);
+    if let Some(ref it) = _i . mode { tokens_helper(_visitor, &(it).0) };
+    _visitor.visit_mutability(& _i . mutability);
     _visitor.visit_ident(& _i . ident);
     if let Some(ref it) = _i . at_token { tokens_helper(_visitor, &(it).0) };
     if let Some(ref it) = _i . subpat { _visitor.visit_pat(& * * it) };
diff --git a/src/gen/visit_mut.rs b/src/gen/visit_mut.rs
index 2de70b6..6debf1d 100644
--- a/src/gen/visit_mut.rs
+++ b/src/gen/visit_mut.rs
@@ -62,8 +62,6 @@
 
 fn visit_bin_op_mut(&mut self, i: &mut BinOp) { visit_bin_op_mut(self, i) }
 # [ cfg ( feature = "full" ) ]
-fn visit_binding_mode_mut(&mut self, i: &mut BindingMode) { visit_binding_mode_mut(self, i) }
-# [ cfg ( feature = "full" ) ]
 fn visit_block_mut(&mut self, i: &mut Block) { visit_block_mut(self, i) }
 
 fn visit_body_mut(&mut self, i: &mut Body) { visit_body_mut(self, i) }
@@ -73,8 +71,6 @@
 fn visit_body_struct_mut(&mut self, i: &mut BodyStruct) { visit_body_struct_mut(self, i) }
 
 fn visit_bound_lifetimes_mut(&mut self, i: &mut BoundLifetimes) { visit_bound_lifetimes_mut(self, i) }
-# [ cfg ( feature = "full" ) ]
-fn visit_capture_by_mut(&mut self, i: &mut CaptureBy) { visit_capture_by_mut(self, i) }
 
 fn visit_const_param_mut(&mut self, i: &mut ConstParam) { visit_const_param_mut(self, i) }
 # [ cfg ( feature = "full" ) ]
@@ -587,19 +583,6 @@
     }
 }
 # [ cfg ( feature = "full" ) ]
-pub fn visit_binding_mode_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut BindingMode) {
-    use ::BindingMode::*;
-    match *_i {
-        ByRef(ref mut _binding_0, ref mut _binding_1, ) => {
-            tokens_helper(_visitor, &mut (_binding_0).0);
-            _visitor.visit_mutability_mut(_binding_1);
-        }
-        ByValue(ref mut _binding_0, ) => {
-            _visitor.visit_mutability_mut(_binding_0);
-        }
-    }
-}
-# [ cfg ( feature = "full" ) ]
 pub fn visit_block_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut Block) {
     tokens_helper(_visitor, &mut (& mut _i . brace_token).0);
     for it in & mut _i . stmts { _visitor.visit_stmt_mut(it) };
@@ -635,16 +618,6 @@
     for mut el in & mut _i . lifetimes { let it = el.item_mut(); _visitor.visit_lifetime_def_mut(it) };
     tokens_helper(_visitor, &mut (& mut _i . gt_token).0);
 }
-# [ cfg ( feature = "full" ) ]
-pub fn visit_capture_by_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut CaptureBy) {
-    use ::CaptureBy::*;
-    match *_i {
-        Value(ref mut _binding_0, ) => {
-            tokens_helper(_visitor, &mut (_binding_0).0);
-        }
-        Ref => { }
-    }
-}
 
 pub fn visit_const_param_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut ConstParam) {
     for it in & mut _i . attrs { _visitor.visit_attribute_mut(it) };
@@ -882,7 +855,7 @@
 # [ cfg ( feature = "full" ) ]
 pub fn visit_expr_closure_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut ExprClosure) {
     for it in & mut _i . attrs { _visitor.visit_attribute_mut(it) };
-    _visitor.visit_capture_by_mut(& mut _i . capture);
+    if let Some(ref mut it) = _i . capture { tokens_helper(_visitor, &mut (it).0) };
     tokens_helper(_visitor, &mut (& mut _i . or1_token).0);
     for mut el in & mut _i . inputs { let it = el.item_mut(); _visitor.visit_fn_arg_mut(it) };
     tokens_helper(_visitor, &mut (& mut _i . or2_token).0);
@@ -1721,7 +1694,8 @@
 }
 # [ cfg ( feature = "full" ) ]
 pub fn visit_pat_ident_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut PatIdent) {
-    _visitor.visit_binding_mode_mut(& mut _i . mode);
+    if let Some(ref mut it) = _i . mode { tokens_helper(_visitor, &mut (it).0) };
+    _visitor.visit_mutability_mut(& mut _i . mutability);
     _visitor.visit_ident_mut(& mut _i . ident);
     if let Some(ref mut it) = _i . at_token { tokens_helper(_visitor, &mut (it).0) };
     if let Some(ref mut it) = _i . subpat { _visitor.visit_pat_mut(& mut * * it) };
diff --git a/src/lib.rs b/src/lib.rs
index 71f47cc..7c5cde1 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -41,7 +41,7 @@
                ExprUnary, ExprUnsafe, ExprWhile, ExprWhileLet, ExprYield, Index, Member};
 
 #[cfg(feature = "full")]
-pub use expr::{Arm, BindingMode, Block, CaptureBy, FieldPat, FieldValue, GenericMethodArgument, Local,
+pub use expr::{Arm, Block, FieldPat, FieldValue, GenericMethodArgument, Local,
                MethodTurbofish, Pat, PatBox, PatIdent, PatLit, PatPath, PatRange, PatRef, PatSlice,
                PatStruct, PatTuple, PatTupleStruct, PatWild, RangeLimits, Stmt};