	public:
		delegate void Handle#{DelegateName}(
			Convert<#{OriginalTypeName1}>::Type #{ValueName1} ,
			Convert<#{OriginalTypeName2}>::Type #{ValueName2} ,
			Convert<#{OriginalTypeName3}>::Type #{ValueName3} ,
			Convert<#{OriginalTypeName4}>::Type #{ValueName4} );
		event Handle#{DelegateName}^ Event#{DelegateName}
		{
			void add(Handle#{DelegateName}^ _value)
			{
				bool empty = mDelegate#{DelegateName} == nullptr;

				mDelegate#{DelegateName} += _value;
				MMYGUI_CHECK_NATIVE(mNative);

				if (empty)
					static_cast<ThisType*>(mNative)->event#{DelegateName} +=
						static_cast< MyGUI::delegates::IDelegate4<
							#{OriginalTypeName1} ,
							#{OriginalTypeName2} ,
							#{OriginalTypeName3} ,
							#{OriginalTypeName4} > *>(
								new Delegate4< Handle#{DelegateName}^ ,
								#{OriginalTypeName1} ,
								#{OriginalTypeName2} ,
								#{OriginalTypeName3} ,
								#{OriginalTypeName4} >(mDelegate#{DelegateName}) );
			}
			void remove(Handle#{DelegateName}^ _value)
			{
				mDelegate#{DelegateName} -= _value;
				MMYGUI_CHECK_NATIVE(mNative);
				
				bool empty = mDelegate#{DelegateName} == nullptr;
				
				if (empty)
					static_cast<ThisType*>(mNative)->event#{DelegateName} -=
						static_cast< MyGUI::delegates::IDelegate4<
							#{OriginalTypeName1} ,
							#{OriginalTypeName2} ,
							#{OriginalTypeName3} ,
							#{OriginalTypeName4} > *>(
								new Delegate4< Handle#{DelegateName}^ ,
									#{OriginalTypeName1} ,
									#{OriginalTypeName2} ,
									#{OriginalTypeName3} ,
									#{OriginalTypeName4} >(mDelegate#{DelegateName}) );
			}
		}
	private:
		Handle#{DelegateName}^ mDelegate#{DelegateName};
