#ifndef  PASSMANAGER_H
#define PASSMANAGER_H

#include "Scanner.h"
#include <string>
#include <map>

namespace xreate {
class AbstractPassBase;
class ClaspLayer;
class LLVMLayer;
class AST;

class PassManager
{
public:
    ~PassManager();
    void* run();
    void runWithoutCompilation();
    void registerPass(AbstractPassBase* pass, AbstractPassBase* prerequisite=nullptr);
    static PassManager* prepareForCode(std::string&& code);
    static PassManager* prepareForCode(Scanner& scanner);

    ClaspLayer* clasp;
    LLVMLayer* llvm;
    AST* root;
private:
    //typedef std::multimap<PassFilter, ASTPass*> FILTERS_STORAGE;
    //FILTERS_STORAGE __filters;
    std::multimap<AbstractPassBase*,  AbstractPassBase*> __passes;
}; }

#endif
