#include "include/network/aopacket.h"

class PacketFactory
{
  public:
    // thingy here to register/map strings to constructors
    static AOPacket *createPacket(QString header, QStringList contents);
    static AOPacket *createPacket(QString raw_packet);
    template <typename T>
    static void registerClass(QString header) { class_map[header] = &createInstance<T>; };

  private:
    template <typename T>
    static AOPacket *createInstance(QStringList contents) { return new T(contents); };
    template <typename T>
    static AOPacket *createInstance(QString header, QStringList contents) { return new T(header, contents); };
    typedef std::map<QString, AOPacket *(*)(QStringList)> type_map;

    static inline type_map class_map;
};