/*
Copyright 2017 The apid Authors

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package apigee

import (
	"istio.io/mixer/pkg/adapter"
)

// Register records the builders exposed by this adapter.
// For the apigee adapter, we will eventually expose multiple builders, each for a different
// aspect of the Apigee functionality.
func Register(r adapter.Registrar) {
	r.RegisterListsBuilder(newKeyCheckBuilder())
	r.RegisterAccessLogsBuilder(newReportBuilder())
}
