docs: function getSections (req, res, record, model, section, labelRequired, cb) {
  
      if (typeof section === 'function') {
          return section(req, res, record, model, (err, html) => cb(err, html));
      }
  
      if (typeof section.body === 'function') {
  
          return section.body(req, res, record, model, function (err, html) {
  
              if (err) {
                  return cb(err);
              }
  
              return cb(null, { label: section.label, body: html });
  
          });
  
      }
  
      if (Array.isArray(section.body)) {
  
          // label is not must for sections inside tab. Hence, passing false value for labelRequired argument of getSections
          return getSections(req, res, record, model, section.body, false, function (err, result) {
  
              if (err) {
                  return cb(err);
              }
  
              // result is an Array of objects. Objects can be in one of the following structure:
              // [ { label: '', body: ''} ]
              // [ { label: '', body: [] } ]
              // [ { label: '', fields: [ { label: '', value: '' }, ... ]} ]
              return cb(null, { label: section.label, body: result });
  
          });
  
      }
  
      if (Array.isArray(section.fields) && section.fields.length) {
  
          // return an Object (e.g. { label: '', fields: [ { label: '', value: '' }, ... ]})
          return renderFields(req, res, record, model, section, cb);
  
      }
  
      if (!Array.isArray(section) || !section.length) {
          return cb();
      }
  
      async.mapSeries(section, function (obj, callback) {
  
          // each object (each tabs) in array section of overview body DSL must have label
          // however, label is optional for sections inside tab
          if (labelRequired && !obj.label) {
              return cb(new Error('One of the label is missing in overview of ' + model.modelName + ' model.'));
          }
  
          // recursively goes over nested section which can have repeated object structures
          return getSections(req, res, record, model, obj, true, callback);
  
      }, cb);
  
  }