#ifndef MARS_MTaskInteractive
#define MARS_MTaskInteractive

#ifndef MARS_MTask
#include "MTask.h"
#endif

class MFilter;
class MTaskList;

class MTaskInteractive : public MTask
{
private:
    TMethodCall *fCall[3];

    Int_t (*fPreProcess)(MParList *list);
    Int_t (*fProcess)();
    Int_t (*fPostProcess)();

    Int_t PreProcess(MParList *list) { if (fCall[0]) return Return(0, &list); return fPreProcess  ? (*fPreProcess)(list) : kTRUE; }
    Int_t Process()                  { if (fCall[1]) return Return(1);        return fProcess     ? (*fProcess)()        : kTRUE; }
    Int_t PostProcess()              { if (fCall[2]) return Return(2);        return fPostProcess ? (*fPostProcess)()    : kTRUE; }

    Int_t Return(Int_t no, void *param=NULL);
    Bool_t Set(void *fcn, Int_t no, const char *params);
    void   Free(Int_t no);

public:
    MTaskInteractive(const char *name=NULL, const char *title=NULL);
    ~MTaskInteractive();

    // This is to be used in compiled code
    void SetPreProcess(Int_t (*func)(MParList *list)) { fPreProcess = func;  Free(0); }
    void SetProcess(Int_t (*func)())                  { fProcess = func;     Free(1);  }
    void SetPostProcess(Int_t (*func)())              { fPostProcess = func; Free(2);  }

    // This is for usage in CINT
    void SetPreProcess(void *fcn)  { Set(fcn, 0, "MParList*"); fPreProcess =0; }
    void SetProcess(void *fcn)     { Set(fcn, 1, "");          fProcess    =0; }
    void SetPostProcess(void *fcn) { Set(fcn, 2, "");          fPostProcess=0; }

    ClassDef(MTaskInteractive, 0) // Interactive task
};

#endif
