#ifndef OBJECT_H
#define OBJECT_H


#include <multimap.h>
#include <list.h>
#include <dump.h>


#define SIGNAL(x)               #x
#define SLOT(x)                 (Object::Function)&x
#define emit(x)                 raise(#x)


// standard base class for doing signals and slots
class Object : public Dumpable
{
public:
    typedef void (Object::*Function)();
    Object();
    virtual ~Object();

    const char *className() const { return "Object"; }
    const char *dump() const { return "{  0, 0, 0 }"; }

    static void connect(Object *sender, const char *signal, Object *receiver, Function func);
    void raise(const char *signal);
private:
    void disconnect(Object *sender, Object *receiver);
    typedef struct { Object *o; int id; } Slot;
    MultiMap<Slot> signalMap;
    List<Function> slotList;
    List<Object*> senderList;
};


#endif // OBJECT_H

