func (attr *Attribute) ForEachCanonicalValues(callback func(canonicalValue string)) {
	for _, cv := range attr.canonicalValues {
		callback(cv)
	}
}
ForEachCanonicalValues invokes callback function on each defined canonical values
package spec
import (
	"encoding/json"
	"fmt"
	"github.com/imulab/go-scim/pkg/v2/annotation"
	"github.com/imulab/go-scim/pkg/v2/spec/internal"
	"reflect"
	"sort"
	"strings"
)
type Attribute struct {
	name            string
	description     string
	typ             Type
	subAttributes   []*Attribute
	canonicalValues []string
	multiValued     bool
	required        bool
	caseExact       bool
	mutability      Mutability
	returned        Returned
	uniqueness      Uniqueness
	referenceTypes  []string
	id              string                             
	index           int                                
	path            string                             
	annotations     map[string]map[string]interface{}  
}
func (attr *Attribute) ID() string {
	return attr.id
}
func (attr *Attribute) Path() string {
	return attr.path
}
func (attr *Attribute) Name() string {
	return attr.name
}
func (attr *Attribute) Description() string {
	return attr.description
}
func (attr *Attribute) Type() Type {
	return attr.typ
}
func (attr *Attribute) MultiValued() bool {
	return attr.multiValued
}
func (attr *Attribute) Required() bool {
	return attr.required
}
func (attr *Attribute) CaseExact() bool {
	return attr.caseExact
}
func (attr *Attribute) Mutability() Mutability {
	return attr.mutability
}
func (attr *Attribute) Returned() Returned {
	return attr.returned
}
func (attr *Attribute) Uniqueness() Uniqueness {
	return attr.uniqueness
}