Fix passthrough handling (#37). (#38)

diff --git a/formatter.go b/formatter.go
index 5efaa94..a317d7b 100644
--- a/formatter.go
+++ b/formatter.go
@@ -30,7 +30,7 @@
 }
 
 func (fo formatter) String() string {
-	return fmt.Sprint(fo.v) // unwrap it
+	return fmt.Sprint(fo.v.Interface()) // unwrap it
 }
 
 func (fo formatter) passThrough(f fmt.State, c rune) {
@@ -47,7 +47,7 @@
 		s += fmt.Sprintf(".%d", p)
 	}
 	s += string(c)
-	fmt.Fprintf(f, s, fo.v)
+	fmt.Fprintf(f, s, fo.v.Interface())
 }
 
 func (fo formatter) Format(f fmt.State, c rune) {
diff --git a/formatter_test.go b/formatter_test.go
index 5f3204e..c8c0b51 100644
--- a/formatter_test.go
+++ b/formatter_test.go
@@ -13,6 +13,11 @@
 	s string
 }
 
+type passtest struct {
+	v    interface{}
+	f, s string
+}
+
 type LongStructTypeName struct {
 	longFieldName      interface{}
 	otherLongFieldName interface{}
@@ -33,8 +38,30 @@
 	fmt.Fprintf(s, "F(%d)", int(f))
 }
 
+type Stringer struct { i int }
+
+func (s *Stringer) String() string { return "foo" }
+
 var long = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
 
+var passthrough = []passtest{
+	{1, "%d", "1"},
+	{"a", "%s", "a"},
+	{&Stringer{}, "%s", "foo"},
+}
+
+func TestPassthrough(t *testing.T) {
+	for _, tt := range passthrough {
+		s := fmt.Sprintf(tt.f, Formatter(tt.v))
+		if tt.s != s {
+			t.Errorf("expected %q", tt.s)
+			t.Errorf("got      %q", s)
+			t.Errorf("expraw\n%s", tt.s)
+			t.Errorf("gotraw\n%s", s)
+		}
+	}
+}
+
 var gosyntax = []test{
 	{nil, `nil`},
 	{"", `""`},