docs: function checkMinMaxExactParams(name, property, node) {
          var num, cb, recoverCb, newArray;
  
          if ('number' === typeof property) {
              newArray = true;
              property = [property];
          }
          else if (!J.isArray(property)) {
              throw new TypeError('SizeManager.init: ' + name +
                                  'Players property must be number or ' +
                                  'non-empty array. Found: ' + property);
          }
  
          num = property[0];
          cb = property[1] || null;
          recoverCb = property[2] || null;
  
          if (num === '@') {
              num = node.game.pl.size() || 1;
              // Recreate the array to avoid altering the reference.
              if (!newArray) {
                  property = property.slice(0);
                  property[0] = num;
              }
          }
          else if (num !== '*' &&
                   ('number' !== typeof num || !isFinite(num) || num < 1)) {
              throw new TypeError('SizeManager.init: ' + name +
                                  'Players must be a finite number greater ' +
                                  'than 1 or one of the wildcards: *,@. Found: ' +
                                  num);
          }
  
          if (!cb) {
              property[1] = null;
          }
          else if ('function' !== typeof cb) {
  
              throw new TypeError('SizeManager.init: ' + name +
                                  'Players cb must be ' +
                                  'function or undefined. Found: ' + cb);
          }
  
          if (!recoverCb) {
              property[2] = null;
          }
          else if ('function' !== typeof cb) {
  
              throw new TypeError('SizeManager.init: ' + name +
                                  'Players recoverCb must be ' +
                                  'function or undefined. Found: ' + recoverCb);
          }
  
          return property;
      }