#ifndef KINECTSKELETONPAYLOADCONTAINER_H__
#define KINECTSKELETONPAYLOADCONTAINER_H__

#include "ritkGenericPayloadContainer.h"
#include "KinectSkeleton.h"

class KinectSkeletonPayloadContainer : public ritk::GenericPayloadContainer
{
public:
	/** @name Standard typedefs */
	//@{
	typedef KinectSkeletonPayloadContainer	Self;
	typedef GenericPayloadContainer			Superclass;
	typedef itk::SmartPointer<Self>			Pointer;
	typedef itk::SmartPointer<const Self>	ConstPointer;
	//@}

	/// Typedefs for the superclass' payload and our image payload
	//@{
	typedef Superclass::PayloadType					PayloadType;
	typedef PayloadType::Pointer					PayloadPointer;
	typedef PayloadType::ConstPointer				PayloadConstPointer;
	typedef KinectSkeleton							KinectSkeletonPayloadType;
	typedef KinectSkeletonPayloadType::Pointer		KinectSkeletonPayloadPointer;
	typedef KinectSkeletonPayloadType::ConstPointer	KinectSkeletonPayloadConstPointer;
	//@}

	/// Object creation
	itkNewMacro(Self);

	/// RTTI
	itkTypeMacro(KinectSkeletonPayloadContainer, ritk::GenericPayloadContainer);

	/// Overloaded. Will internally simply ensure that only images defined by the template parameter can be used
	virtual void SetPayload(PayloadType *payload);


	/**	@brief	Graft a data object
	 *	@param	data	the data object
	 *
	 *	@details
	 *	This methods has to graft (aka. shallow copy) the given data object. 
	 *	Usually, grafting should only performed if the given argument can be casted to a generic payload container.
	 *	This method should then graft the container's actual payload.
	 */
	virtual void Graft(const DataObject *data);

	/**	@brief	Deep copy a data object
	 *	@param	data	the data object
	 *
	 *	@details
	 *	This method has to deep-copy the given data object.
	 *	@sa	Graft()
	 */
	virtual void DeepCopy(const DataObject *data);
		

protected:
	/// Constructor
	KinectSkeletonPayloadContainer();
	/// Destructor
	virtual ~KinectSkeletonPayloadContainer();

	/// Print the object on a stream
	virtual void PrintSelf(std::ostream& os, itk::Indent indent) const;

private:
	/// purposely not implemented
	KinectSkeletonPayloadContainer(Self&);

	/// purposely not implemented
	void operator=(const Self&); 
};


#endif // KINECTSKELETONPAYLOADCONTAINER_H__