code: func GetManagerForChain(chainID string) msp.MSPManager {
  	m.Lock()
  	defer m.Unlock()
  
  	mspMgr, ok := mspMap[chainID]
  	if !ok {
  		mspLogger.Debugf("Created new msp manager for channel `%s`", chainID)
  		mspMgmtMgr := &mspMgmtMgr{msp.NewMSPManager(), false}
  		mspMap[chainID] = mspMgmtMgr
  		mspMgr = mspMgmtMgr
  	} else {
  		// check for internal mspManagerImpl and mspMgmtMgr types. if a different
  		// type is found, it's because a developer has added a new type that
  		// implements the MSPManager interface and should add a case to the logic
  		// above to handle it.
  		if !(reflect.TypeOf(mspMgr).Elem().Name() == "mspManagerImpl" || reflect.TypeOf(mspMgr).Elem().Name() == "mspMgmtMgr") {
  			panic("Found unexpected MSPManager type.")
  		}
  		mspLogger.Debugf("Returning existing manager for channel '%s'", chainID)
  	}
  	return mspMgr
  }
docs: // GetManagerForChain returns the msp manager for the supplied
  // chain; if no such manager exists, one is created