#ifndef ZMEXCLASSINFO_H
#define ZMEXCLASSINFO_H


// ----------------------------------------------------------------------
//
// ZMexClassInfo.h - class declaration for the member of ZOOM Exception
//		     classes that contains all the static information
//		     that does NOT depend on the parent class.
//
//	Every ZOOM exception must have a static member classInfo, of type
//	ZMexClassInfo.  This is done in the macro ZMexStandardContents.
//	See ZMexception.h.
//
// 	Methods (in .icc):
// 	 	ZMexClassInfo() constructor
//  		const string name() const;
//  		const string facility() const;
//  		int nextCount();
//  		ZMexHandler getHandler() const;
//  		ZMexHandler setHandler(const ZMexHandler & newHandler);
// 	 	ZMexLogger getLogger() const;
//  		ZMexLogger setLogger(const ZMexLogger & newLogger);
//		void logNMore();
//              bool OKtoLog() const;
//		int count() const;
//		int filterMax() const;
//
//	A related header is ZMexHeritage.h which contains class static info
//	which DOES depend on the parent class.
//
// Revision History
//	970911	MF	Initial version
//	970914	MF	Added nextCount to be able to keep count_ private
//	970916	WEB	Updated per code review
//	970917	WEB	Updated per code review 2
//      971112  WEB	Updated for conformance to standard and the zoom
//			compatability headers
//	971211	WEB	Updated per code walkthrough
//	971217	WEB	Added count() and filterMax() member functions
//	980219	WEB	Fixed get/set Logger/Handler return type
//	980615	WEB	Added namespace support
//      990721  JVR     Added setName, setFacility, and setSeverity functions
//      000217  WEB     Improve C++ standard compliance
//      000503  WEB     Avoid global using
//      010411  MF	setName, setFacility and setSeverity return old value
//			and take const argument reference
//	011212	WEB	Pass all std::strings by const &; add new 3- and
//			4-arg constructors in lieu of a single 5-arg
//			constructor taking default arguments

//
// ----------------------------------------------------------------------


#ifndef ZMENVIRONMENT_H
  #include "ZMutility/ZMenvironment.h"
#endif

#ifndef STRING_INCLUDED
  #define STRING_INCLUDED
  #include <string>
#endif

#ifndef ZMEXHANDLER_H
  #include "Exceptions/ZMexHandler.h"
#endif

#ifndef ZMEXLOGGER_H
  #include "Exceptions/ZMexLogger.h"
#endif

#ifndef ZMEXSEVERITY_H
  #include "Exceptions/ZMexSeverity.h"
#endif


ZM_BEGIN_NAMESPACE( zmex )	/*  namespace zmex  {  */


// ******************************************************
//
// ZMexClassInfo
//
// Template for ZMexClassInfo (used to define classInfo)
//
// ******************************************************

// Contains all the methods which are logically "virtual class statics",
// and which do not depend on a Parent's method (see note (1)).
// Each derived exception contains a ZMexClassInfo member named classInfo.

// The members and functions of ZMexClassInfo are public so that when the
// exception class uses classInfo it can get at the info.  But classInfo itself
// is declared protected, to isolate this from the actual interface.


class ZMexClassInfo {

  // - Methods - //

public:

  ZMexClassInfo(
    const std::string & name
  , const std::string & facility
  , const ZMexSeverity  s = ZMexERROR
  );

  ZMexClassInfo(
    const std::string & name
  , const std::string & facility
  , const ZMexSeverity  s
  , const ZMexHandler & h
  );

  ZMexClassInfo(
    const std::string & name
  , const std::string & facility
  , const ZMexSeverity  s
  , const ZMexHandler & h
  , const ZMexLogger &  l
  );

  const std::string name() const;
    // return the name_ of this exception type, which ought to match the
    // class name ZMexWhatever.
  const std::string setName(const std::string& newName);

  const std::string facility() const;
    // return the name of facility_ this exception type is under.
  const std::string setFacility(const std::string& newFacility);

  ZMexSeverity severity() const;
    // return the severity_ of the exception class.
  ZMexSeverity setSeverity(const ZMexSeverity& newSeverity);

  int nextCount();
    // increment the count_ and return that value
  int count() const;
    // return the current count_ value

  ZMexHandler getHandler () const ;
  ZMexHandler setHandler( const ZMexHandler & newHandler );
    // Replace previous handler with this new one.

  ZMexLogger getLogger() const;
  ZMexLogger setLogger( const ZMexLogger & newLogger );
    // Replace previous logger with this new one.

  void logNMore( const int N );
    // Allow logging the next N exceptions of this class.

  bool OKtoLog() const;
    // May the currently-thrown exception be logged
    // (based on count_ <= filterMax_)?

  int filterMax() const;
    // return the current filterMax_ value

  // - Data Members - //

private:
  int           count_;
  int           filterMax_;
  std::string   name_;                                             // was const
  std::string   facility_;                                         // was const
  ZMexSeverity  severity_;                                         // was const

  ZMexHandler   handler_;
  ZMexLogger    logger_;

};  // ZMexClassInfo


ZM_END_NAMESPACE( zmex )	/*  }  // namespace zmex  */


#define ZMEXCLASSINFO_ICC
#include "Exceptions/ZMexClassInfo.icc"
#undef ZMEXCLASSINFO_ICC


#endif  // ZMEXCLASSINFO_H
