/*
 * Copyright 2009 Google Inc.
 *
 * 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 com.google.gwt.core.ext;

import java.util.List;
import java.util.Set;
import java.util.SortedSet;

/**
 * A named deferred binding (property, value) pair for use in generators.
 *
 * @see com.google.gwt.core.ext.linker.SelectionProperty A similarly-named
 * analog for linkers.
 */
public interface SelectionProperty {

  /**
   * The name of the property.
   *
   * @return the property name as a String.
   * */
  String getName();

  /**
   * The value for the permutation currently being considered.
   *
   * @return the property value as a String.
   */
  String getCurrentValue();

  /**
   * Gets the fallback value for the property.
   * @return the fallback, or ""
   */
  String getFallbackValue();

  /**
   * Returns the list of fall back values for a given value.
   * @param value the property value
   * @return the fall back list of values by increasing order
   *         of preference.
   */
  List<? extends Set<String>> getFallbackValues(String value);

  /**
   * Returns the possible values for the property in sorted order.
   *
   * @return a SortedSet of Strings containing the possible property values.
   */
  SortedSet<String> getPossibleValues();
}
