#include <xs/Io.h>

namespace xs {

void Io::_validate () {
    if (!sv) return;
    if (SvTYPE(sv) == SVt_PVIO) return;
    if (SvTYPE(sv) == SVt_PVGV && GvIOp(sv)) {
        Sv::operator=(GvIOp(sv));
        return;
    }

    if (SvROK(sv)) {
        SV* val = SvRV(sv);
        if (SvTYPE(val) == SVt_PVIO) {
            Sv::operator=(val);
            return;
        }
        if (SvTYPE(val) == SVt_PVGV && GvIOp(val)) {
            Sv::operator=(GvIOp(val));
            return;
        }
    }

    if (is_undef()) return reset();
    reset();
    throw std::invalid_argument("SV is neither IO or IO reference, nor Glob or Glob reference with IO slot set");
}

}