code: /*
   * The contents of this file are subject to the terms
   * of the Common Development and Distribution License
   * (the "License").  You may not use this file except
   * in compliance with the License.
   * 
   * You can obtain a copy of the license at
   * https://jwsdp.dev.java.net/CDDLv1.0.html
   * See the License for the specific language governing
   * permissions and limitations under the License.
   * 
   * When distributing Covered Code, include this CDDL
   * HEADER in each file and include the License file at
   * https://jwsdp.dev.java.net/CDDLv1.0.html  If applicable,
   * add the following below this CDDL HEADER, with the
   * fields enclosed by brackets "[]" replaced with your
   * own identifying information: Portions Copyright [yyyy]
   * [name of copyright owner]
   */
  package com.sun.xml.xsom;
  
  import com.sun.xml.xsom.visitor.XSTermFunction;
  import com.sun.xml.xsom.visitor.XSTermVisitor;
  import com.sun.xml.xsom.visitor.XSTermFunctionWithParam;
  
  /**
   * A component that can be referenced from {@link XSParticle}
   * 
   * This interface provides a set of type check functions (<code>isXXX</code>),
   * which are essentially:
   * 
   * <pre>
   * boolean isXXX() {
   *     return this instanceof XXX;
   * }
   * <pre>
   * 
   * and a set of cast functions (<code>asXXX</code>), which are
   * essentially:
   * 
   * <pre>
   * XXX asXXX() {
   *     if(isXXX())  return (XXX)this;
   *     else          return null;
   * }
   * </pre>
   */
  public interface XSTerm extends XSComponent
  {
      void visit( XSTermVisitor visitor );
      <T> T apply( XSTermFunction<T> function );
      <T,P> T apply( XSTermFunctionWithParam<T,P> function, P param );
  
      // cast functions
      boolean isWildcard();
      boolean isModelGroupDecl();
      boolean isModelGroup();
      boolean isElementDecl();
  
      XSWildcard asWildcard();
      XSModelGroupDecl asModelGroupDecl();
      XSModelGroup asModelGroup();
      XSElementDecl asElementDecl();
  }
  