docs: function parseRules (fields, data) {
    data = data || {}
  
    return Object.keys(fields).reduce((result, field) => {
      let rules = fields[field]
  
      /**
       * Strings are passed to haye for further processing
       * and if rules are not an array or a string, then
       * we should blow.
       */
      if (typeof (rules) === 'string') {
        rules = Pipe(rules, new ArrayPresenter())
      } else if (!Array.isArray(rules)) {
        throw new Error('Rules must be defined as a string or an array')
      }
  
      /**
       * When field name has a star in it, we need to do some heavy
       * lifting and expand the field to dot properties based upon
       * the available data inside the data object.
       */
      if (field.indexOf('*') > -1) {
        const nodes = field.split(/\.\*\.?/)
        starToIndex(nodes, data).forEach((f) => { result[f] = rules })
      } else {
        result[field] = rules
      }
  
      return result
    }, {})
  }