## Copyright 2007-2008 Cisco Systems Inc.
##
## 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 automatically generated by:
//   $version
//   $now
// This file is automatically created for your convenience and will not be
// overwritten once it exists! Please edit this file as necessary to implement
// your service logic.
#set($i = $intf.name())
#set($vfname = "ValueFactory$i")
#set($intfname = "$i$suffix")
#set($clname = "Impl$intfname")
#set($baseclname = "Base$i$suffix")
#if ($helper.isServer($mc))
#set($peer = "client")
#set($peerclass = "Remote${i}Client")
#else
#set($peer = "server")
#set($peerclass = "Remote${i}Server")
#end

using System;

#foreach( $n in $intf.iterator() )
#if ($n.isExtern())
#if ($n.hasImport( $helper ))
using $n.getImport( $helper );
#end
#end
#end

#foreach( $x in $intf.iterator() )
#if( $x.isMixin() )
#set( $m = $x.getModule() )
#set( $z = $m.iterator().next() )
using ${m.name()}.types.$z.name();
#end
#end

using ${intf.parent().name()}.types.${i};

///<summary>Your custom implementation of $baseclname. Add methods here to provide
///implementation of messages from the $peer. </summary>
namespace $intf.parent().name()
{
	///<summary>Implementation for $clname</summary>
	public class $clname : $baseclname
	{
		/// <summary>Constructs the $clname.</summary>
 		/// <param name="$peer">a connection to the $peer session. Use this to
 		/// send a message to the $peer.</param>
		public $clname($peerclass $peer)
		{
			this.$peer = $peer;
		}
		
		/// <summary>A connection to the $peer session. Use this to
 		/// send a message to the $peer.</summary>
		private readonly $peerclass $peer;
	
		// TODO: Implement delegates or provide implementation of $intfname
		// messages from the $peer	
	}
}