#ifndef NBOBASECLASS_HPP_INCLUDED
#define NBOBASECLASS_HPP_INCLUDED

#include <memory>
#include <string>
#include <vector>

namespace Inscoper::NBO {

class NBOBaseClass;

using NBOBaseClassPtr = std::shared_ptr<NBOBaseClass>;

/*!
* \brief
*/
class NBOBaseClass {
public:
  virtual ~NBOBaseClass() = default;

  /*!
	* \brief Returns a list of all classes derived from this class
	*
	* \return The list of derived classes
	*/
  virtual std::vector<NBOBaseClassPtr> getChildren() const = 0;

  /*!
	* \brief Returns a list of all child element instances contained in this class
	*
	* \return The list of child instances
	*/
  virtual std::vector<NBOBaseClassPtr> getSubElements() const = 0;

  /*!
	* \brief Returns the class type name
	*
	* \return The class type name
	*/
  virtual std::string getTypeName() const = 0;

  /*!
	* \brief Returns the XML element name corresponding to this class
	*
	* \return The XML element name
	*/
  virtual std::string getXMLName() const = 0;

  /*!
	* \brief Returns the NBO Type corresponding to this class
	*
	* \return The NBO Type value
	*/
  virtual ENBOType getNBOType() const = 0;
};

} // namespace Inscoper::NBO

#endif // NBOBASECLASS_HPP_INCLUDED