#include <xs/unievent/Handle.h>

using namespace xs;
using namespace panda::unievent;
using panda::string_view;

namespace xs {
namespace unievent {

static std::map<HandleType, SV*>& registered_perl_classes() {
    static std::map<HandleType, SV*> inst;
    return inst;
}

Sv handle_perl_class(const HandleType& type) {
    auto i = registered_perl_classes().find(type);
    if (i == registered_perl_classes().end()) return Stash{};
    else return i->second;
}

void register_perl_class(const HandleType& t, const Stash& st) {
    auto i = registered_perl_classes().find(t);
    if (i != registered_perl_classes().end() && st != i->second) {
        panda::string err = panda::string("Handle type ") + t.name + "is already registered as " + st.name();
        throw std::logic_error(std::string(err.data(), err.length()));
    }
    registered_perl_classes().insert({t, st});
}

}}

MODULE = UniEvent::Handle                PACKAGE = UniEvent::Handle
PROTOTYPES: DISABLE

BOOT {
    Stash stash(__PACKAGE__);
    stash.add_const_sub("UNKNOWN_TYPE", Simple(Handle::UNKNOWN_TYPE.name));
}

Loop* Handle::loop ()

string_view Handle::type () {
    RETVAL = THIS->type().name;
}

bool Handle::active ()

void Handle::reset ()

void Handle::clear ()

bool Handle::weak (bool value = false) {
    if (items > 1) {
        THIS->weak(value);
        XSRETURN_UNDEF;
    }
    RETVAL = THIS->weak();
}

int CLONE_SKIP (...) {
    XSRETURN_YES;
    PERL_UNUSED_VAR(items);
}