/**
* Copyright 2004 The Apache Software Foundation.
* 
* 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 org.apache.ws.jaxme.examples.misc.address;

public interface AddressType {
  public interface NameType {
    
  
  
    public java.lang.String getFirst();
  
    public void setFirst(java.lang.String pFirst);
  
    public java.util.List getMiddle();
  
    public java.lang.String getLast();
  
    public void setLast(java.lang.String pLast);
  
    public java.lang.String getInitials();
  
    public void setInitials(java.lang.String pInitials);
  
  }

  public java.lang.String getId();

  public void setId(java.lang.String pId);

  public org.apache.ws.jaxme.examples.misc.address.AddressType.NameType getName();

  public void setName(org.apache.ws.jaxme.examples.misc.address.AddressType.NameType pName);

}
