#ifndef PROCEDURE_H_INCLUDED
#define PROCEDURE_H_INCLUDED

#include <iostream>
#include "enumerator.h"

template <class Item>
class Procedure
{
    protected:
        Enumerator<Item> *enor;

        Procedure():enor(NULL){}
        virtual void Init() = 0;
        virtual void First() {enor->First();}
        virtual bool WhileCond(const Item& current) const { return true; }
        virtual void Do(const Item& current) = 0;

    public:
        enum Exceptions { ExpectedEnumerator};
        void Run();
        void AddEnumerator(Enumerator<Item>* en){ enor = en;}
        virtual ~Procedure(){}
};

template <class Item>
void Procedure<Item>::Run()
{
    if(enor==NULL) throw ExpectedEnumerator;
    Init();
    for(First(); !enor->End() && WhileCond(enor->Current()); enor->Next()){
        Do(enor->Current());
    }
}

#endif /*PROCEDURE_H_INCLUDED*/
