#ifndef EXTRA_INTERNAL_PLUGIN_H
#define EXTRA_INTERNAL_PLUGIN_H

#include "dobby_internal.h"

#include "InterceptRouting/InterceptRouting.h"

class RoutingPluginInterface {
public:
    // @Return: if false will continue to iter next plugin
    virtual bool Prepare(InterceptRouting *routing) = 0;

    // @Return: if false will continue to iter next plugin
    virtual bool Active(InterceptRouting *routing) = 0;

    // @Return: if false will continue to iter next plugin
    virtual bool GenerateTrampolineBuffer(InterceptRouting *routing, void *src, void *dst) = 0;

private:
    char name_[256];
};

class RoutingPluginManager {
public:
    static void registerPlugin(const char *name, RoutingPluginInterface *plugin);

public:
    // global plugin array
    static LiteMutableArray *plugins;

    static RoutingPluginInterface *near_branch_trampoline;
};


#endif