code: func NewMongoCacheWithTTL(session *mgo.Session, configs ...Option) *MongoCache {
  	if session == nil {
  		panic("session must be set")
  	}
  
  	mc := &MongoCache{
  		mongeSession:   session,
  		TTL:            defaultExpireDuration,
  		CollectionName: defaultCollectionName,
  		GCInterval:     defaultGCInterval,
  		GCStart:        false,
  	}
  
  	for _, configFunc := range configs {
  		configFunc(mc)
  	}
  
  	if mc.GCStart {
  		mc.StartGC(mc.GCInterval)
  	}
  
  	return mc
  }
docs: // NewMongoCacheWithTTL creates a caching layer backed by mongo. TTL's are
  // managed either by a background cleaner or document is removed on the Get
  // operation. Mongo TTL indexes are not utilized since there can be multiple
  // systems using the same collection with different TTL values.
  //
  // The responsibility of stopping the GC process belongs to the user.
  //
  // Session is not closed while stopping the GC.
  //
  // This self-referential function satisfy you to avoid passing
  // nil value to the function as parameter
  // e.g (usage) :
  // configure with defaults, just call;
  // NewMongoCacheWithTTL(session)
  //
  // configure ttl duration with;
  // NewMongoCacheWithTTL(session, func(m *MongoCache) {
  // 		m.TTL = 2 * time.Minute
  // })
  // or
  // NewMongoCacheWithTTL(session, SetTTL(time.Minute * 2))
  //
  // configure collection name with;
  // NewMongoCacheWithTTL(session, func(m *MongoCache) {
  // 		m.CollectionName = "MongoCacheCollectionName"
  // })