
#if !defined( INCLUDED_SIGNALFWD_H )
#define INCLUDED_SIGNALFWD_H

class SignalHandler;
template<typename FirstArgument>
class SignalHandler1;
template<typename FirstArgument, typename SecondArgument>
class SignalHandler2;
template<typename FirstArgument, typename SecondArgument, typename ThirdArgument>
class SignalHandler3;

template<typename Context>
class Opaque;

///\brief A pointer that always has a well-defined value.
/// If no value is specified, the appropriate null value is used.
template<typename Type>
class Handle
{
Type* p;
public:
Handle() : p( 0 ){
}
explicit Handle( Type* p ) : p( p ){
}
Type* get() const {
	return p;
}
bool isNull() const {
	return p == 0;
}
};

template<typename Handler>
class SignalFwd
{
public:
typedef Handle< Opaque<Handler> > handler_id_type;
};

typedef SignalFwd<SignalHandler>::handler_id_type SignalHandlerId;

#endif
