static register(types, controlClass, parentType) {

    // store subtypes as <type>.<subtype> in the register
    const prefix = parentType ? parentType + '.' : ''

    // initialise the register
    if (!control.classRegister) {
      control.classRegister = {}
    }
    if (!Array.isArray(types)) {
      types = [types]
    }

    // associate the controlClass with each passed control type
    for (const type of types) {
      // '.' is a restricted character for type names
      if (type.indexOf('.') !== -1) {
        control.error(`Ignoring type ${type}. Cannot use the character '.' in a type name.`)
        continue
      }

      control.classRegister[prefix + type] = controlClass
    }
  }
Class method to register supported controls and their associated classes
@param {Array} types - control type (or array of control types) to register
against the specifed class
@param {Class} controlClass - class to map against the types
@param {String} parentType - optional - if defined, any classes registered
will be registered as subtypes of this parent