/*
 * Copyright 2011 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.requestfactory.rebind.model;

/**
 * Implements traversal across a RequestFactory model.
 *
 * <p><span style='color:red'>RequestFactory has moved to
 * <code>com.google.web.bindery.requestfactory</code>.  This package will be
 * removed in a future version of GWT.</span></p>
 */
@Deprecated
public class ModelVisitor {
  public void endVisit(ContextMethod x) {
  }

  public void endVisit(EntityProxyModel x) {
  }

  public void endVisit(RequestFactoryModel x) {
  }

  public void endVisit(RequestMethod x) {
  }

  public boolean visit(ContextMethod x) {
    return true;
  }

  public boolean visit(EntityProxyModel x) {
    return true;
  }

  public boolean visit(RequestFactoryModel x) {
    return true;
  }

  public boolean visit(RequestMethod x) {
    return true;
  }
}
