code: func NewWithData(initializer InitializerWithData, opts ...options.Opt) *Reference {
  	lazyRef := &Reference{
  		params: params{
  			initialInit: InitOnFirstAccess,
  		},
  		initializer: initializer,
  	}
  
  	options.Apply(lazyRef, opts)
  
  	if lazyRef.expirationProvider != nil {
  		// This is an expiring reference. After the initializer is
  		// called, set a timer that will call the expiration handler.
  		initializer := lazyRef.initializer
  		initialExpiration := lazyRef.expirationProvider()
  		lazyRef.initializer = func(data interface{}) (interface{}, error) {
  			value, err := initializer(data)
  			if err == nil {
  				lazyRef.ensureTimerStarted(initialExpiration)
  			}
  			return value, err
  		}
  
  		lazyRef.closech = make(chan bool, 1)
  
  		if lazyRef.expirationHandler == nil {
  			if lazyRef.expiryType == Refreshing {
  				lazyRef.expirationHandler = lazyRef.refreshValue
  			} else {
  				lazyRef.expirationHandler = lazyRef.resetValue
  			}
  		}
  
  		if lazyRef.initialInit >= 0 {
  			lazyRef.ensureTimerStarted(lazyRef.initialInit)
  		}
  	}
  
  	return lazyRef
  }
docs: // NewWithData creates a new reference where data is passed from the Get
  // function to the initializer. This is useful for refreshing the reference
  // with dynamic data.