code: function getModule (name, methods, options) {
      // throw error on invalid name
      requireValidName(name)
      // get validated options, set defaults
      options = getValidOptions(options, true)
      // if no methods were passed then return module instance
      if (!defined(methods)) {
          // throw error if module not defined
          if (!defined(immutable.modules[name])) {
              throw new Error(`module error: module not found ${name}`)
          }
          // return module
          return immutable.modules[name]
      }
      // if methods were passed throw error if module already defined
      if (defined(immutable.modules[name]) && !options.allowOverride) {
          throw new Error(`module error: module already defined ${name}`)
      }
      // create new module
      var module = immutable.modules[name] = new ImmutableCoreModule(name, options)
      // add methods to object
      _.each(methods, (method, methodName) => {
          // create new method use module options
          module.method(methodName, method, module.meta.options)
          // bind to method if it exists
          doBindForMethod(`${name}.${methodName}`)
      })
      // return module
      return module
  }
docs: @function getModule
  
  get and optionally create a new module. if methods object is passed then
  new module will be created, otherwise existing module will be returned.
  
  errors will be thrown on attempts to create multiple modules or methods
  with the same name as well as if attempting to use the reserved words
  defined in get-valid-name.
  
  @param {string} name - name of module
  @param {object} methods - module functions (optional)
  @param {object} options - options (optional)
  
  @returns {object} - object containing wrapped module functions
  
  @throws {Error}