/*
 * Copyright 2006 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.json.client;

/**
 * Represents a JSON boolean value.
 */
public class JSONBoolean extends JSONValue {

  private static final JSONBoolean FALSE = new JSONBoolean(false);
  private static final JSONBoolean TRUE = new JSONBoolean(true);

  /**
   * Gets a reference to the singleton instance representing either
   * <code>true</code> or <code>false</code>.
   * 
   * @param b controls which value to get
   * @return if <code>true</code>, the JSONBoolean instance representing
   *         <code>true</code> is returned; otherwise, the JSONBoolean
   *         instance representing <code>false</code> is returned
   */
  public static JSONBoolean getInstance(boolean b) {
    if (b) {
      return TRUE;
    } else {
      return FALSE;
    }
  }

  /*
   * This private constructor is used to build true and false.
   */
  private JSONBoolean(boolean value) {
    this.value = value;
  }

  /**
   * Returns <code>true</code> if this is the instance representing "true",
   * <code>false</code> otherwise.
   */
  public boolean booleanValue() {
    return value;
  }

  /**
   * Returns <code>this</code>, as this is a JSONBoolean.
   */
  public JSONBoolean isBoolean() {
    return this;
  }

  /**
   * Returns "true" for the true value, and "false" for the false value.
   */
  public String toString() {
    return Boolean.toString(value);
  }

  private final boolean value;
}
