/*
 * Copyright 2010 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.web.bindery.requestfactory.shared;

/**
 * Used to test entity proxies as map keys
 */
@ProxyForName("com.google.web.bindery.requestfactory.server.MapKey")
public interface MapKeyProxy extends EntityProxy {

  void setId(String id);

  String getId();

  void setSimple(SimpleValueProxy simple);

  SimpleValueProxy getSimple();

}
