uses reflect.DeepEqual instead of ==