function compose() {
      var funcs = arguments,
          length = funcs.length;

      while (length--) {
        if (!isFunction(funcs[length])) {
          throw new TypeError;
        }
      }
      return function() {
        var args = arguments,
            length = funcs.length;

        while (length--) {
          args = [funcs[length].apply(this, args)];
        }
        return args[0];
      };
    }
Creates a function that is the composition of the provided functions,
where each function consumes the return value of the function that follows.
For example, composing the functions `f()`, `g()`, and `h()` produces `f(g(h()))`.
Each function is executed with the `this` binding of the composed function.

@static
@memberOf _
@category Functions
@param {...Function} [func] Functions to compose.
@returns {Function} Returns the new composed function.
@example

var realNameMap = {
  'pebbles': 'penelope'
};

var format = function(name) {
  name = realNameMap[name.toLowerCase()] || name;
  return name.charAt(0).toUpperCase() + name.slice(1).toLowerCase();
};

var greet = function(formatted) {
  return 'Hiya ' + formatted + '!';
};

var welcome = _.compose(greet, format);
welcome('pebbles');
// => 'Hiya Penelope!'