/**
 * <copyright>
 * </copyright>
 *
 * $Id$
 */
package lobj;

import org.eclipse.emf.ecore.EObject;

/**
 * <!-- begin-user-doc --> A representation of the model object '<em><b>Address</b></em>'. <!--
 * end-user-doc -->
 * 
 * <p>
 * The following features are supported:
 * <ul>
 * <li>{@link lobj.Address#getStreet <em>Street</em>}</li>
 * <li>{@link lobj.Address#getPostcode <em>Postcode</em>}</li>
 * <li>{@link lobj.Address#getCity <em>City</em>}</li>
 * <li>{@link lobj.Address#getState <em>State</em>}</li>
 * <li>{@link lobj.Address#getCountry <em>Country</em>}</li>
 * <li>{@link lobj.Address#getPhone <em>Phone</em>}</li>
 * <li>{@link lobj.Address#getFax <em>Fax</em>}</li>
 * <li>{@link lobj.Address#getEmail <em>Email</em>}</li>
 * <li>{@link lobj.Address#getOtheraddr <em>Otheraddr</em>}</li>
 * <li>{@link lobj.Address#getId <em>Id</em>}</li>
 * </ul>
 * </p>
 * 
 * @see lobj.LobjPackage#getAddress()
 * @model extendedMetaData="kind='elementOnly'"
 * @generated
 */
public interface Address extends EObject {
	/**
	 * Returns the value of the '<em><b>Street</b></em>' attribute. <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Street</em>' attribute isn't clear, there really should be more of a
	 * description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * 
	 * @return the value of the '<em>Street</em>' attribute.
	 * @see #setStreet(String)
	 * @see lobj.LobjPackage#getAddress_Street()
	 * @model unique="false" extendedMetaData="kind='element'"
	 * @generated
	 */
	String getStreet();

	/**
	 * Sets the value of the '{@link lobj.Address#getStreet <em>Street</em>}' attribute. <!--
	 * begin-user-doc --> <!-- end-user-doc -->
	 * 
	 * @param value
	 *          the new value of the '<em>Street</em>' attribute.
	 * @see #getStreet()
	 * @generated
	 */
	void setStreet(String value);

	/**
	 * Returns the value of the '<em><b>Postcode</b></em>' attribute. <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Postcode</em>' attribute isn't clear, there really should be more of
	 * a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * 
	 * @return the value of the '<em>Postcode</em>' attribute.
	 * @see #setPostcode(String)
	 * @see lobj.LobjPackage#getAddress_Postcode()
	 * @model unique="false" extendedMetaData="kind='element'"
	 * @generated
	 */
	String getPostcode();

	/**
	 * Sets the value of the '{@link lobj.Address#getPostcode <em>Postcode</em>}' attribute. <!--
	 * begin-user-doc --> <!-- end-user-doc -->
	 * 
	 * @param value
	 *          the new value of the '<em>Postcode</em>' attribute.
	 * @see #getPostcode()
	 * @generated
	 */
	void setPostcode(String value);

	/**
	 * Returns the value of the '<em><b>City</b></em>' attribute. <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>City</em>' attribute isn't clear, there really should be more of a
	 * description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * 
	 * @return the value of the '<em>City</em>' attribute.
	 * @see #setCity(String)
	 * @see lobj.LobjPackage#getAddress_City()
	 * @model unique="false" extendedMetaData="kind='element'"
	 * @generated
	 */
	String getCity();

	/**
	 * Sets the value of the '{@link lobj.Address#getCity <em>City</em>}' attribute. <!--
	 * begin-user-doc --> <!-- end-user-doc -->
	 * 
	 * @param value
	 *          the new value of the '<em>City</em>' attribute.
	 * @see #getCity()
	 * @generated
	 */
	void setCity(String value);

	/**
	 * Returns the value of the '<em><b>State</b></em>' attribute. <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>State</em>' attribute isn't clear, there really should be more of a
	 * description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * 
	 * @return the value of the '<em>State</em>' attribute.
	 * @see #setState(String)
	 * @see lobj.LobjPackage#getAddress_State()
	 * @model unique="false" extendedMetaData="kind='element'"
	 * @generated
	 */
	String getState();

	/**
	 * Sets the value of the '{@link lobj.Address#getState <em>State</em>}' attribute. <!--
	 * begin-user-doc --> <!-- end-user-doc -->
	 * 
	 * @param value
	 *          the new value of the '<em>State</em>' attribute.
	 * @see #getState()
	 * @generated
	 */
	void setState(String value);

	/**
	 * Returns the value of the '<em><b>Country</b></em>' attribute. <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Country</em>' attribute isn't clear, there really should be more of
	 * a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * 
	 * @return the value of the '<em>Country</em>' attribute.
	 * @see #setCountry(String)
	 * @see lobj.LobjPackage#getAddress_Country()
	 * @model unique="false" extendedMetaData="kind='element'"
	 * @generated
	 */
	String getCountry();

	/**
	 * Sets the value of the '{@link lobj.Address#getCountry <em>Country</em>}' attribute. <!--
	 * begin-user-doc --> <!-- end-user-doc -->
	 * 
	 * @param value
	 *          the new value of the '<em>Country</em>' attribute.
	 * @see #getCountry()
	 * @generated
	 */
	void setCountry(String value);

	/**
	 * Returns the value of the '<em><b>Phone</b></em>' attribute. <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Phone</em>' attribute isn't clear, there really should be more of a
	 * description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * 
	 * @return the value of the '<em>Phone</em>' attribute.
	 * @see #setPhone(String)
	 * @see lobj.LobjPackage#getAddress_Phone()
	 * @model unique="false" extendedMetaData="kind='element'"
	 * @generated
	 */
	String getPhone();

	/**
	 * Sets the value of the '{@link lobj.Address#getPhone <em>Phone</em>}' attribute. <!--
	 * begin-user-doc --> <!-- end-user-doc -->
	 * 
	 * @param value
	 *          the new value of the '<em>Phone</em>' attribute.
	 * @see #getPhone()
	 * @generated
	 */
	void setPhone(String value);

	/**
	 * Returns the value of the '<em><b>Fax</b></em>' attribute. <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Fax</em>' attribute isn't clear, there really should be more of a
	 * description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * 
	 * @return the value of the '<em>Fax</em>' attribute.
	 * @see #setFax(String)
	 * @see lobj.LobjPackage#getAddress_Fax()
	 * @model unique="false" extendedMetaData="kind='element'"
	 * @generated
	 */
	String getFax();

	/**
	 * Sets the value of the '{@link lobj.Address#getFax <em>Fax</em>}' attribute. <!-- begin-user-doc
	 * --> <!-- end-user-doc -->
	 * 
	 * @param value
	 *          the new value of the '<em>Fax</em>' attribute.
	 * @see #getFax()
	 * @generated
	 */
	void setFax(String value);

	/**
	 * Returns the value of the '<em><b>Email</b></em>' attribute. <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Email</em>' attribute isn't clear, there really should be more of a
	 * description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * 
	 * @return the value of the '<em>Email</em>' attribute.
	 * @see #setEmail(String)
	 * @see lobj.LobjPackage#getAddress_Email()
	 * @model unique="false" extendedMetaData="kind='element'"
	 * @generated
	 */
	String getEmail();

	/**
	 * Sets the value of the '{@link lobj.Address#getEmail <em>Email</em>}' attribute. <!--
	 * begin-user-doc --> <!-- end-user-doc -->
	 * 
	 * @param value
	 *          the new value of the '<em>Email</em>' attribute.
	 * @see #getEmail()
	 * @generated
	 */
	void setEmail(String value);

	/**
	 * Returns the value of the '<em><b>Otheraddr</b></em>' attribute. <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Otheraddr</em>' attribute isn't clear, there really should be more
	 * of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * 
	 * @return the value of the '<em>Otheraddr</em>' attribute.
	 * @see #setOtheraddr(String)
	 * @see lobj.LobjPackage#getAddress_Otheraddr()
	 * @model unique="false" extendedMetaData="kind='element'"
	 * @generated
	 */
	String getOtheraddr();

	/**
	 * Sets the value of the '{@link lobj.Address#getOtheraddr <em>Otheraddr</em>}' attribute. <!--
	 * begin-user-doc --> <!-- end-user-doc -->
	 * 
	 * @param value
	 *          the new value of the '<em>Otheraddr</em>' attribute.
	 * @see #getOtheraddr()
	 * @generated
	 */
	void setOtheraddr(String value);

	/**
	 * Returns the value of the '<em><b>Id</b></em>' attribute. <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Id</em>' attribute isn't clear, there really should be more of a
	 * description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * 
	 * @return the value of the '<em>Id</em>' attribute.
	 * @see #setId(String)
	 * @see lobj.LobjPackage#getAddress_Id()
	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID" required="true"
	 *        extendedMetaData="kind='attribute'"
	 * @generated
	 */
	String getId();

	/**
	 * Sets the value of the '{@link lobj.Address#getId <em>Id</em>}' attribute. <!-- begin-user-doc
	 * --> <!-- end-user-doc -->
	 * 
	 * @param value
	 *          the new value of the '<em>Id</em>' attribute.
	 * @see #getId()
	 * @generated
	 */
	void setId(String value);

} // Address
