code: func NewBroker(opts ...broker.Option) broker.Broker {
  	options := broker.Options{
  		Context: context.Background(),
  	}
  
  	for _, o := range opts {
  		o(&options)
  	}
  	var openTopic topicOpener
  	var openSub subOpener
  	var err error
  	if projID, ok := options.Context.Value(gcpProjectIDKey{}).(gcp.ProjectID); ok {
  		ts := options.Context.Value(gcpTokenSourceKey{}).(gcp.TokenSource)
  		openTopic, openSub, err = setupGCP(options.Context, projID, ts)
  	} else if rurl, ok := options.Context.Value(rabbitURLKey{}).(string); ok {
  		openTopic, openSub, err = setupRabbit(options.Context, rurl)
  	} else {
  		openTopic, openSub, err = setupMem()
  	}
  	if err != nil {
  		return &pubsubBroker{err: err}
  	}
  	return &pubsubBroker{
  		options:   options,
  		openTopic: openTopic,
  		openSub:   openSub,
  		topics:    map[string]*pubsub.Topic{},
  		subs:      map[string]*pubsub.Subscription{},
  	}
  }
docs: // NewBroker creates a new gocloud pubsubBroker.
  // If the GCPProjectID option is set, Go Cloud uses its Google Cloud PubSub implementation.
  // If the RabbitURL option is set, Go Cloud uses its RabbitMQ implementation.
  // Otherwise, Go Cloud uses its in-memory implementation.