/*
 * Copyright 2003-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.
 *
 * This file was auto-generated by the Axis C++ Web Service Generator (WSDL2Ws)
 * This file contains definitions of the web service
 */

#include "XSD_NMTOKENPort.hpp"


XSD_NMTOKENPort::XSD_NMTOKENPort()
{
}

XSD_NMTOKENPort::~XSD_NMTOKENPort()
{
}

/* This function is called by the AxisEngine when something went wrong
 with the current web service request processing. Appropriate actions should
 be taken here.*/
void XSD_NMTOKENPort::onFault()
{
}

xsd__NMTOKEN XSD_NMTOKENPort::asNonNillableElement(xsd__NMTOKEN Value0)  
{
	return Value0;
}
xsd__NMTOKEN XSD_NMTOKENPort::asNillableElement(xsd__NMTOKEN Value0)  
{
	return Value0;
}
RequiredAttributeElement* XSD_NMTOKENPort::asRequiredAttribute(RequiredAttributeElement* Value0)  
{
	return Value0;
}
OptionalAttributeElement* XSD_NMTOKENPort::asOptionalAttribute(OptionalAttributeElement* Value0)  
{
	return Value0;
}
xsd__NMTOKEN_Array * XSD_NMTOKENPort::asArray(xsd__NMTOKEN_Array * Value0)  
{
	return Value0;
}
SimpleComplexType* XSD_NMTOKENPort::asComplexType(SimpleComplexType* Value0)  
{
	return Value0;
}
