#macro( UpperCamel $name )
#set( $name = "${name.substring(0,1).toUpperCase()}${name.substring(1)}" )
#end
#macro( toUpperCamel $name )${name.substring(0,1).toUpperCase()}${name.substring(1)}#end



#set( $amqp_ClassName = $amqpClass.Name) 
#UpperCamel( $amqp_ClassName )
#set( $amqp_MethodName = $amqpMethod.Name ) 
#UpperCamel( $amqp_MethodName )
#set( $javaClassName = "${amqp_ClassName}${amqp_MethodName}Body" )


#set( $filename = "${javaClassName}.java")
/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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 is auto-generated by ${generator} - do not modify.
 * Supported AMQP version:
 #foreach( $supportedVersion in $model.VersionSet )
 *   $supportedVersion.getMajor()-$supportedVersion.getMinor()
 #end
 */
 
 
package org.apache.qpid.framing;


public interface ${javaClassName} extends EncodableAMQDataBlock, AMQMethodBody
{
    
    
#foreach( $field in $amqpMethod.Fields )

#if( $amqpMethod.isCommon( $field ) )
    public $field.ConsistentNativeType get#toUpperCamel( ${field.Name} )();
#end
#end



}
