// Author: Wim Lavrijsen   March 2008

#ifndef ROOT_TPySelector
#define ROOT_TPySelector

//////////////////////////////////////////////////////////////////////////////
//                                                                          //
// TPySelector                                                              //
//                                                                          //
// Python base class equivalent of PROOF TSelector.                         //
//                                                                          //
//////////////////////////////////////////////////////////////////////////////


//- ROOT
#ifndef ROOT_TSelector
#include "TSelector.h"
#endif

#ifndef ROOT_TTree
#include "TTree.h"
#endif

// Python
struct _object;
typedef _object PyObject;


class TPySelector : public TSelector {
public:
   using TSelector::fStatus;
// using TSelector::fAbort;
   using TSelector::fOption;
   using TSelector::fObject;
   using TSelector::fInput;
   using TSelector::fOutput;

public:
   TTree* fChain;

public:
// ctor/dtor ... cctor and assignment are private in base class
   TPySelector( TTree* /* tree */ = 0, PyObject* self = 0 );
   virtual ~TPySelector();

// TSelector set of forwarded (overridden) methods
   virtual Int_t  Version() const;
   virtual Int_t  GetEntry( Long64_t entry, Int_t getall = 0 );
   virtual Bool_t Notify();

   virtual void   Init( TTree* tree );
   virtual void   Begin( TTree* tree = 0 /* not used */ );
   virtual void   SlaveBegin( TTree* tree );
   virtual Bool_t Process( Long64_t entry );
   virtual void   SlaveTerminate();
   virtual void   Terminate();

   virtual void Abort( const char* why, EAbort what = kAbortProcess );

   ClassDef( TPySelector, 1 );   //Python equivalent base class for PROOF

private:
// private helpers for forwarding to python
   void SetupPySelf();
   PyObject* CallSelf( const char* method, PyObject* pyobject = 0 );

private:
   PyObject* fPySelf;              //! actual python object
};

#endif
