Provide a trait to invoke parser functions
diff --git a/src/lib.rs b/src/lib.rs
index afe414f..98aea1d 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -509,9 +509,7 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 #[cfg(feature = "parsing")]
-use synom::Synom;
-#[cfg(feature = "parsing")]
-use buffer::TokenBuffer;
+use synom::{Synom, Parser};
 
 #[cfg(feature = "parsing")]
 mod error;
@@ -594,25 +592,13 @@
 where
     T: Synom,
 {
-    let buf = TokenBuffer::new2(tokens);
-    let result = T::parse(buf.begin());
-    let err = match result {
-        Ok((t, rest)) => {
-            if rest.eof() {
-                return Ok(t);
-            } else if rest == buf.begin() {
-                // parsed nothing
-                ParseError::new("failed to parse anything")
-            } else {
-                ParseError::new("failed to parse all tokens")
-            }
+    let parser = T::parse;
+    parser.parse2(tokens).map_err(|err| {
+        match T::description() {
+            Some(s) => ParseError::new(format!("failed to parse {}: {}", s, err)),
+            None => err,
         }
-        Err(err) => err,
-    };
-    match T::description() {
-        Some(s) => Err(ParseError::new(format!("failed to parse {}: {}", s, err))),
-        None => Err(err),
-    }
+    })
 }
 
 /// Parse a string of Rust code into the chosen syntax tree node.