Remove `fields_mut`, replace `fields()` with `fields.iter()`
diff --git a/src/derive.rs b/src/derive.rs
index 875d6f2..2705737 100644
--- a/src/derive.rs
+++ b/src/derive.rs
@@ -7,7 +7,7 @@
 // except according to those terms.
 
 use super::*;
-use punctuated::{Iter, IterMut, Punctuated};
+use punctuated::{Iter, Punctuated};
 
 ast_struct! {
     /// Data structure sent to a `proc_macro_derive` macro.
@@ -75,23 +75,23 @@
     do_not_generate_to_tokens
 }
 
-impl DataStruct {
-    /// Returns an iterator over the fields of this struct
-    pub fn fields(&self) -> MaybeEmpty<Iter<Field, Token![,]>> {
-        match self.fields {
+impl Fields {
+    /// Returns an iterator over the fields
+    pub fn iter(&self) -> MaybeEmpty<Iter<Field, Token![,]>> {
+        match *self {
             Fields::Unit => MaybeEmpty::None,
             Fields::Named(FieldsNamed { ref named, .. }) => MaybeEmpty::Some(named.iter()),
             Fields::Unnamed(FieldsUnnamed { ref unnamed, .. }) => MaybeEmpty::Some(unnamed.iter()),
         }
     }
+}
 
-    /// Returns an iterator over mutable references to the fields of this struct
-    pub fn fields_mut(&mut self) -> MaybeEmpty<IterMut<Field, Token![,]>> {
-        match self.fields {
-            Fields::Unit => MaybeEmpty::None,
-            Fields::Named(FieldsNamed { ref mut named, .. }) => MaybeEmpty::Some(named.iter_mut()),
-            Fields::Unnamed(FieldsUnnamed { ref mut unnamed, .. }) => MaybeEmpty::Some(unnamed.iter_mut()),
-        }
+impl<'a> IntoIterator for &'a Fields {
+    type Item = &'a Field;
+    type IntoIter = MaybeEmpty<Iter<'a, Field, Token![,]>>;
+
+    fn into_iter(self) -> Self::IntoIter {
+        self.iter()
     }
 }
 
diff --git a/tests/test_derive_input.rs b/tests/test_derive_input.rs
index 30f836b..a9fe242 100644
--- a/tests/test_derive_input.rs
+++ b/tests/test_derive_input.rs
@@ -637,7 +637,7 @@
         _ => panic!("expected a struct"),
     };
 
-    assert_eq!(0, struct_body.fields().count());
+    assert_eq!(0, struct_body.fields.iter().count());
 }
 
 #[test]
@@ -671,7 +671,7 @@
     ];
     let expected = expected.iter().collect::<Vec<_>>();
 
-    assert_eq!(expected, struct_body.fields().collect::<Vec<_>>());
+    assert_eq!(expected, struct_body.fields.iter().collect::<Vec<_>>());
 }
 
 #[test]
@@ -702,81 +702,5 @@
     ];
     let expected = expected.iter().collect::<Vec<_>>();
 
-    assert_eq!(expected, struct_body.fields().collect::<Vec<_>>());
-}
-
-#[test]
-fn test_fields_mut_on_unit_struct() {
-    let raw = "struct S;";
-    let mut struct_body = match syn::parse_str::<DeriveInput>(raw).unwrap().data {
-        Data::Struct(body) => body,
-        _ => panic!("expected a struct"),
-    };
-
-    assert_eq!(0, struct_body.fields_mut().count());
-}
-
-#[test]
-fn test_fields_mut_on_named_struct() {
-    let raw = "struct S {
-        foo: i32,
-        pub bar: String,
-    }";
-    let mut struct_body = match syn::parse_str::<DeriveInput>(raw).unwrap().data {
-        Data::Struct(body) => body,
-        _ => panic!("expected a struct"),
-    };
-
-    let mut expected = vec![
-        Field {
-            attrs: vec![],
-            vis: Visibility::Inherited,
-            ident: Some(Ident::from("foo")),
-            colon_token: Some(Default::default()),
-            ty: syn::parse_str("i32").unwrap(),
-        },
-        Field {
-            attrs: vec![],
-            vis: Visibility::Public(VisPublic {
-                pub_token: Default::default(),
-            }),
-            ident: Some(Ident::from("bar")),
-            colon_token: Some(Default::default()),
-            ty: syn::parse_str("String").unwrap(),
-        },
-    ];
-    let expected = expected.iter_mut().collect::<Vec<_>>();
-
-    assert_eq!(expected, struct_body.fields_mut().collect::<Vec<_>>());
-}
-
-#[test]
-fn test_fields_mut_on_tuple_struct() {
-    let raw = "struct S(i32, pub String);";
-    let mut struct_body = match syn::parse_str::<DeriveInput>(raw).unwrap().data {
-        Data::Struct(body) => body,
-        _ => panic!("expected a struct"),
-    };
-
-    let mut expected = vec![
-        Field {
-            attrs: vec![],
-            vis: Visibility::Inherited,
-            ident: None,
-            colon_token: None,
-            ty: syn::parse_str("i32").unwrap(),
-        },
-        Field {
-            attrs: vec![],
-            vis: Visibility::Public(VisPublic {
-                pub_token: Default::default(),
-            }),
-            ident: None,
-            colon_token: None,
-            ty: syn::parse_str("String").unwrap(),
-        },
-    ];
-    let expected = expected.iter_mut().collect::<Vec<_>>();
-
-    assert_eq!(expected, struct_body.fields_mut().collect::<Vec<_>>());
+    assert_eq!(expected, struct_body.fields.iter().collect::<Vec<_>>());
 }