code: function ImmutableAccessControl (args) {
      // make sure args are object
      args = requireValidOptionalObject(args)
      // return global singleton if it exists
      if (args.global !== false && global.__immutable_access_control__) {
          return global.__immutable_access_control__
      }
      // initialize new instance
      else {
          // store new instance as global singleton
          if (args.global !== false) {
              global.__immutable_access_control__ = this
          }
          // id will be calculated from rules after they are set
          this.id = undefined
          // names of properties use for determining ownership of model records
          // map of model name -> property name - default is accountId
          this.accessIdNames = {}
          // list of rules set with default flag
          this.defaultRules = []
          // rules object is a map of resources and roles 
          this.rules = {}
          // use strict mode by default which will throw error if requesting
          // access without a valid session
          this.strict = args.strict === undefined ? true : !!args.strict
          // audit will be create for each allow request
          this.audit = undefined
          // audit enabled by default
          this.auditEnabled = args.audit === false ? false : true
      }
  }
docs: @function ImmutableAccessControl
  
  instantiate or return global singleton access control instance.
  
  @param {object} args
  
  @returns {ImmutableAccessControl}
  
  @throws {Error}