StringToSliceHookFunc
diff --git a/decode_hooks.go b/decode_hooks.go
new file mode 100644
index 0000000..1321ba1
--- /dev/null
+++ b/decode_hooks.go
@@ -0,0 +1,22 @@
+package mapstructure
+
+import (
+	"reflect"
+	"strings"
+)
+
+// StringToSliceHookFunc returns a DecodeHookFunc that converts
+// string to []string by splitting on the given sep.
+func StringToSliceHookFunc(sep string) DecodeHookFunc {
+	return func(
+		f reflect.Kind,
+		t reflect.Kind,
+		data interface{}) (interface{}, error) {
+		if f != reflect.String || t != reflect.Slice {
+			return data, nil
+		}
+
+		raw := data.(string)
+		return strings.Split(raw, sep), nil
+	}
+}
diff --git a/decode_hooks_test.go b/decode_hooks_test.go
new file mode 100644
index 0000000..2e22e22
--- /dev/null
+++ b/decode_hooks_test.go
@@ -0,0 +1,39 @@
+package mapstructure
+
+import (
+	"reflect"
+	"testing"
+)
+
+func TestStringToSliceHookFunc(t *testing.T) {
+	f := StringToSliceHookFunc(",")
+
+	cases := []struct {
+		f, t   reflect.Kind
+		data   interface{}
+		result interface{}
+		err    bool
+	}{
+		{reflect.Slice, reflect.Slice, 42, 42, false},
+		{reflect.String, reflect.String, 42, 42, false},
+		{
+			reflect.String,
+			reflect.Slice,
+			"foo,bar,baz",
+			[]string{"foo", "bar", "baz"},
+			false,
+		},
+	}
+
+	for i, tc := range cases {
+		actual, err := f(tc.f, tc.t, tc.data)
+		if tc.err != (err != nil) {
+			t.Fatalf("case %d: expected err %#v", i, tc.err)
+		}
+		if !reflect.DeepEqual(actual, tc.result) {
+			t.Fatalf(
+				"case %d: expected %#v, got %#v",
+				i, tc.result, actual)
+		}
+	}
+}