Move group parsing out of ParseBuffer impl
diff --git a/src/group.rs b/src/group.rs
index 923a41a..ca37545 100644
--- a/src/group.rs
+++ b/src/group.rs
@@ -7,82 +7,69 @@
 use private;
 use token;
 
+// Not public API.
+#[doc(hidden)]
 pub struct Parens<'a> {
     pub token: token::Paren,
     pub content: ParseBuffer<'a>,
 }
 
+// Not public API.
+#[doc(hidden)]
 pub struct Braces<'a> {
     pub token: token::Brace,
     pub content: ParseBuffer<'a>,
 }
 
+// Not public API.
+#[doc(hidden)]
 pub struct Brackets<'a> {
     pub token: token::Bracket,
     pub content: ParseBuffer<'a>,
 }
 
+// Not public API.
 #[cfg(any(feature = "full", feature = "derive"))]
+#[doc(hidden)]
 pub struct Group<'a> {
     pub token: token::Group,
     pub content: ParseBuffer<'a>,
 }
 
-impl<'a> ParseBuffer<'a> {
-    fn parse_delimited(&self, delimiter: Delimiter) -> Result<(Span, ParseBuffer<'a>)> {
-        self.step(|cursor| {
-            if let Some((content, span, rest)) = cursor.group(delimiter) {
-                let unexpected = private::get_unexpected(self);
-                let content =
-                    private::new_parse_buffer(span, cursor.advance(content), unexpected);
-                Ok(((span, content), rest))
-            } else {
-                let message = match delimiter {
-                    Delimiter::Parenthesis => "expected parentheses",
-                    Delimiter::Brace => "expected curly braces",
-                    Delimiter::Bracket => "expected square brackets",
-                    Delimiter::None => "expected invisible group",
-                };
-                Err(cursor.error(message))
-            }
+// Not public API.
+#[doc(hidden)]
+pub fn parse_parens(input: ParseStream) -> Result<Parens> {
+    parse_delimited(input, Delimiter::Parenthesis)
+        .map(|(span, content)| Parens {
+            token: token::Paren(span),
+            content: content,
         })
-    }
+}
 
-    // Not public API.
-    #[doc(hidden)]
-    pub fn parse_parens(&self) -> Result<Parens<'a>> {
-        self.parse_delimited(Delimiter::Parenthesis)
-            .map(|(span, content)| Parens {
-                token: token::Paren(span),
-                content: content,
-            })
-    }
+// Not public API.
+#[doc(hidden)]
+pub fn parse_braces(input: ParseStream) -> Result<Braces> {
+    parse_delimited(input, Delimiter::Brace)
+        .map(|(span, content)| Braces {
+            token: token::Brace(span),
+            content: content,
+        })
+}
 
-    // Not public API.
-    #[doc(hidden)]
-    pub fn parse_braces(&self) -> Result<Braces<'a>> {
-        self.parse_delimited(Delimiter::Brace)
-            .map(|(span, content)| Braces {
-                token: token::Brace(span),
-                content: content,
-            })
-    }
-
-    // Not public API.
-    #[doc(hidden)]
-    pub fn parse_brackets(&self) -> Result<Brackets<'a>> {
-        self.parse_delimited(Delimiter::Bracket)
-            .map(|(span, content)| Brackets {
-                token: token::Bracket(span),
-                content: content,
-            })
-    }
+// Not public API.
+#[doc(hidden)]
+pub fn parse_brackets(input: ParseStream) -> Result<Brackets> {
+    parse_delimited(input, Delimiter::Bracket)
+        .map(|(span, content)| Brackets {
+            token: token::Bracket(span),
+            content: content,
+        })
 }
 
 #[cfg(any(feature = "full", feature = "derive"))]
 impl private {
     pub fn parse_group(input: ParseStream) -> Result<Group> {
-        input.parse_delimited(Delimiter::None)
+        parse_delimited(input, Delimiter::None)
             .map(|(span, content)| Group {
                 token: token::Group(span),
                 content: content,
@@ -90,6 +77,25 @@
     }
 }
 
+fn parse_delimited(input: ParseStream, delimiter: Delimiter) -> Result<(Span, ParseBuffer)> {
+    input.step(|cursor| {
+        if let Some((content, span, rest)) = cursor.group(delimiter) {
+            let unexpected = private::get_unexpected(input);
+            let content =
+                private::new_parse_buffer(span, cursor.advance(content), unexpected);
+            Ok(((span, content), rest))
+        } else {
+            let message = match delimiter {
+                Delimiter::Parenthesis => "expected parentheses",
+                Delimiter::Brace => "expected curly braces",
+                Delimiter::Bracket => "expected square brackets",
+                Delimiter::None => "expected invisible group",
+            };
+            Err(cursor.error(message))
+        }
+    })
+}
+
 /// Parse a set of parentheses and expose their content to subsequent parsers.
 ///
 /// # Example
@@ -138,7 +144,7 @@
 #[macro_export]
 macro_rules! parenthesized {
     ($content:ident in $cursor:expr) => {
-        match $crate::parse::ParseBuffer::parse_parens(&$cursor) {
+        match $crate::group::parse_parens(&$cursor) {
             $crate::export::Ok(parens) => {
                 $content = parens.content;
                 parens.token
@@ -218,7 +224,7 @@
 #[macro_export]
 macro_rules! braced {
     ($content:ident in $cursor:expr) => {
-        match $crate::parse::ParseBuffer::parse_braces(&$cursor) {
+        match $crate::group::parse_braces(&$cursor) {
             $crate::export::Ok(braces) => {
                 $content = braces.content;
                 braces.token
@@ -276,7 +282,7 @@
 #[macro_export]
 macro_rules! bracketed {
     ($content:ident in $cursor:expr) => {
-        match $crate::parse::ParseBuffer::parse_brackets(&$cursor) {
+        match $crate::group::parse_brackets(&$cursor) {
             $crate::export::Ok(brackets) => {
                 $content = brackets.content;
                 brackets.token
diff --git a/src/lib.rs b/src/lib.rs
index 1d6c60c..0209fb8 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -311,9 +311,11 @@
 #[macro_use]
 mod macros;
 
+// Not public API.
 #[cfg(feature = "parsing")]
+#[doc(hidden)]
 #[macro_use]
-mod group;
+pub mod group;
 
 #[macro_use]
 pub mod token;