whole_func_string: function extendMulti () {
          var args = argsToArray(arguments),
              deep = extractBoolFromArrayStart(args),
              arg0 = args.shift();
  
          // Extend object `0` with other objects
          args.forEach(function (arg) {
              // Extend `arg0` if `arg` is an object
              if (isObject(arg)) {
                  extend(arg0, arg, deep);
              }
          });
  
          return arg0;
      }
func_code_string: function extendMulti () {
          var args = argsToArray(arguments),
              deep = extractBoolFromArrayStart(args),
              arg0 = args.shift();
  
          // Extend object `0` with other objects
          args.forEach(function (arg) {
              // Extend `arg0` if `arg` is an object
              if (isObject(arg)) {
                  extend(arg0, arg, deep);
              }
          });
  
          return arg0;
      }
func_documentation_string: Extends first object passed in with all other object passed in after.
  First param could be a boolean indicating whether or not to perform a deep extend.
  Last param could also be a boolean indicating whether to use legacy setters if they are available
  on the receiving object.
  
  @example (if last param to passed in to `sjl.extend` is `true`
  var o = {setGreeting: v => this.greeting = 'Hello ' + v},
  otherObject = {greeting: 'Junior'};
  // Calls o.setGreeting when merging otherObject because `true` was passed in
  // as the last parameter
  sjl.extend(o, otherObject, true);
  
  @function module:sjl.extend
  @arg `0`    {Object|Boolean} - If boolean, causes `extend` to perform a deep extend.  Optional.
  @arg `1-*`  {Object} - Objects to merge on @arg 0.
  @arg `last` {Boolean} - Optional.
  @returns    {Object|null} - Returns first object passed in or null if no values were passed in.