Ok, the commit message explains the decision (though there should still be an explanatory code comment). Are there fields on `o` that people have been asking for? String formatters were really designed specifically for `{value}`, and formatter functions would handle the rest, so barring developer outcry, I'd be inclined to move this logic the other direction and do something like

```
return (o.value === null || o.value === undefined) ? o.value : fromTemplate(formatter, { value: o.value });
```

or in the formatterFn factory, regex inspect the formatter string to see if any other fields are used, and return a function optimized to just the `o.value` case or `Y.mix({ value: o.value }, o.data, [data fields extracted from template])`. E.g.

```
Formatters._stringTemplate = function (col) {
                 // extract all the {token}s, unfortunately with their leading { ...
    var template = col.formatter,
        fields = template.match(/\{\w+(?=\})/g)
                    // ...then join them together and prune the first { ["{foo", "{bar"] => "foo{bar" ...
                    .join('').slice(1)
                    // ...then split them into a field name list for use by `Y.mix()`
                    .split('{');

    if (!fields.length) {
        return function () { return template; };
    } else if (fields.length === 1 && fields[0] === 'value') {
        return function (o) {
            return (o.value === null || o.value === undefined) ? o.value : fromTemplate(template, { value: o.value });
        };
    } else {
        return function (o) {
            return (o.value === null || o.value === undefined) ? o.value :
                fromTemplate(template, Y.mix({ value: o.value }, o.data, false, fields));
        };
    }
};
```

That's just off the cuff code, so I may have missed something, so YMMV.