//
// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.7
// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
// Any modifications to this file will be lost upon recompilation of the source schema.
// Generated on: 2014.08.06 at 11:57:31 AM CEST
//

package com.sun.research.ws.wadl;

import javax.xml.bind.annotation.XmlRegistry;

/**
 * This object contains factory methods for each
 * Java content interface and Java element interface
 * generated in the com.sun.research.ws.wadl package.
 * <p>An ObjectFactory allows you to programatically
 * construct new instances of the Java representation
 * for XML content. The Java representation of XML
 * content can consist of schema derived interfaces
 * and classes representing the binding of schema
 * type definitions, element declarations and model
 * groups.  Factory methods for each of these are
 * provided in this class.
 *
 */
@XmlRegistry
public class ObjectFactory {

    /**
     * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: com.sun
     * .research.ws.wadl
     *
     */
    public ObjectFactory() {
    }

    /**
     * Create an instance of {@link Resources }
     *
     */
    public Resources createResources() {
        return new Resources();
    }

    /**
     * Create an instance of {@link Doc }
     *
     */
    public Doc createDoc() {
        return new Doc();
    }

    /**
     * Create an instance of {@link Resource }
     *
     */
    public Resource createResource() {
        return new Resource();
    }

    /**
     * Create an instance of {@link Param }
     *
     */
    public Param createParam() {
        return new Param();
    }

    /**
     * Create an instance of {@link Option }
     *
     */
    public Option createOption() {
        return new Option();
    }

    /**
     * Create an instance of {@link Link }
     *
     */
    public Link createLink() {
        return new Link();
    }

    /**
     * Create an instance of {@link Method }
     *
     */
    public Method createMethod() {
        return new Method();
    }

    /**
     * Create an instance of {@link Request }
     *
     */
    public Request createRequest() {
        return new Request();
    }

    /**
     * Create an instance of {@link Representation }
     *
     */
    public Representation createRepresentation() {
        return new Representation();
    }

    /**
     * Create an instance of {@link Response }
     *
     */
    public Response createResponse() {
        return new Response();
    }

    /**
     * Create an instance of {@link Application }
     *
     */
    public Application createApplication() {
        return new Application();
    }

    /**
     * Create an instance of {@link Grammars }
     *
     */
    public Grammars createGrammars() {
        return new Grammars();
    }

    /**
     * Create an instance of {@link Include }
     *
     */
    public Include createInclude() {
        return new Include();
    }

    /**
     * Create an instance of {@link ResourceType }
     *
     */
    public ResourceType createResourceType() {
        return new ResourceType();
    }

}
