code: func (p *AWSProvider) Zones() (map[string]*route53.HostedZone, error) {
  	zones := make(map[string]*route53.HostedZone)
  
  	var tagErr error
  	f := func(resp *route53.ListHostedZonesOutput, lastPage bool) (shouldContinue bool) {
  		for _, zone := range resp.HostedZones {
  			if !p.zoneIDFilter.Match(aws.StringValue(zone.Id)) {
  				continue
  			}
  
  			if !p.zoneTypeFilter.Match(zone) {
  				continue
  			}
  
  			if !p.domainFilter.Match(aws.StringValue(zone.Name)) {
  				continue
  			}
  
  			// Only fetch tags if a tag filter was specified
  			if !p.zoneTagFilter.IsEmpty() {
  				tags, err := p.tagsForZone(*zone.Id)
  				if err != nil {
  					tagErr = err
  					return false
  				}
  				if !p.zoneTagFilter.Match(tags) {
  					continue
  				}
  			}
  
  			zones[aws.StringValue(zone.Id)] = zone
  		}
  
  		return true
  	}
  
  	err := p.client.ListHostedZonesPages(&route53.ListHostedZonesInput{}, f)
  	if err != nil {
  		return nil, err
  	}
  	if tagErr != nil {
  		return nil, tagErr
  	}
  
  	for _, zone := range zones {
  		log.Debugf("Considering zone: %s (domain: %s)", aws.StringValue(zone.Id), aws.StringValue(zone.Name))
  	}
  
  	return zones, nil
  }
docs: // Zones returns the list of hosted zones.