Consolidate Operand code
diff --git a/codegen/src/main.rs b/codegen/src/main.rs
index c128e06..cc48ddd 100644
--- a/codegen/src/main.rs
+++ b/codegen/src/main.rs
@@ -17,6 +17,7 @@
 mod full;
 mod gen;
 mod json;
+mod operand;
 mod parse;
 mod version;
 mod visit;
diff --git a/codegen/src/operand.rs b/codegen/src/operand.rs
new file mode 100644
index 0000000..db3bd18
--- /dev/null
+++ b/codegen/src/operand.rs
@@ -0,0 +1,38 @@
+use proc_macro2::TokenStream;
+use quote::quote;
+
+pub enum Operand {
+    Borrowed(TokenStream),
+    Owned(TokenStream),
+}
+
+pub use self::Operand::*;
+
+impl Operand {
+    pub fn tokens(&self) -> &TokenStream {
+        match self {
+            Borrowed(n) | Owned(n) => n,
+        }
+    }
+
+    pub fn ref_tokens(&self) -> TokenStream {
+        match self {
+            Borrowed(n) => n.clone(),
+            Owned(n) => quote!(&#n),
+        }
+    }
+
+    pub fn ref_mut_tokens(&self) -> TokenStream {
+        match self {
+            Borrowed(n) => n.clone(),
+            Owned(n) => quote!(&mut #n),
+        }
+    }
+
+    pub fn owned_tokens(&self) -> TokenStream {
+        match self {
+            Borrowed(n) => quote!(*#n),
+            Owned(n) => n.clone(),
+        }
+    }
+}
diff --git a/codegen/src/visit.rs b/codegen/src/visit.rs
index 818ad61..9f85df9 100644
--- a/codegen/src/visit.rs
+++ b/codegen/src/visit.rs
@@ -1,3 +1,4 @@
+use crate::operand::*;
 use crate::{file, full, gen};
 use inflections::Inflect;
 use proc_macro2::{Span, TokenStream};
@@ -17,35 +18,6 @@
     Ident::new(&name.to_snake_case(), Span::call_site())
 }
 
-enum Operand {
-    Borrowed(TokenStream),
-    Owned(TokenStream),
-}
-
-use self::Operand::*;
-
-impl Operand {
-    fn tokens(&self) -> &TokenStream {
-        match self {
-            Borrowed(n) | Owned(n) => n,
-        }
-    }
-
-    fn ref_tokens(&self) -> TokenStream {
-        match self {
-            Borrowed(n) => n.clone(),
-            Owned(n) => quote!(&#n),
-        }
-    }
-
-    fn owned_tokens(&self) -> TokenStream {
-        match self {
-            Borrowed(n) => quote!(*#n),
-            Owned(n) => n.clone(),
-        }
-    }
-}
-
 fn simple_visit(item: &str, name: &Operand) -> TokenStream {
     let ident = under_name(item);
     let method = Ident::new(&format!("visit_{}", ident), Span::call_site());
diff --git a/codegen/src/visit_mut.rs b/codegen/src/visit_mut.rs
index 51d0c81..850ba56 100644
--- a/codegen/src/visit_mut.rs
+++ b/codegen/src/visit_mut.rs
@@ -1,3 +1,4 @@
+use crate::operand::*;
 use crate::{file, full, gen};
 use inflections::Inflect;
 use proc_macro2::{Span, TokenStream};
@@ -17,35 +18,6 @@
     Ident::new(&name.to_snake_case(), Span::call_site())
 }
 
-enum Operand {
-    Borrowed(TokenStream),
-    Owned(TokenStream),
-}
-
-use self::Operand::*;
-
-impl Operand {
-    fn tokens(&self) -> &TokenStream {
-        match self {
-            Borrowed(n) | Owned(n) => n,
-        }
-    }
-
-    fn ref_mut_tokens(&self) -> TokenStream {
-        match self {
-            Borrowed(n) => n.clone(),
-            Owned(n) => quote!(&mut #n),
-        }
-    }
-
-    fn owned_tokens(&self) -> TokenStream {
-        match self {
-            Borrowed(n) => quote!(*#n),
-            Owned(n) => n.clone(),
-        }
-    }
-}
-
 fn simple_visit(item: &str, name: &Operand) -> TokenStream {
     let ident = under_name(item);
     let method = Ident::new(&format!("visit_{}_mut", ident), Span::call_site());