MODULE = XLog               PACKAGE = XLog::Module
PROTOTYPES: DISABLE

#// ->new($name, [$level])
#// ->new($name, $module, [$level])
Sv new (SV* cls, string name, Sv arg1 = {}, Sv arg2 = {}) {
    --items;
    Module* module;
    if (items == 1) {
        module = new Module(name);
    }
    else if (items == 2) {
        if (!arg1.defined() || arg1.is_object_ref()) module = new Module(name, xs::in<Module*>(arg1));
        else                                         module = new Module(name, xs::in<Level>(arg1));
    } else {
        module = new Module(name, xs::in<Module*>(arg1), xs::in<Level>(arg2));
    }
    
    // Module* has non-owning ptr typemap. In case of creating object from perl we must switch to "owning" behaviour
    // so we need to hook sv destruction and delete the object if we created it in this method.
    static Sv::payload_marker_t module_dtor_marker;
    module_dtor_marker.svt_free = [](pTHX_ SV*, MAGIC* mg) {
        delete (Module*)mg->mg_ptr;
        return 0;
    };
    
    Object o = xs::out(module, cls);
    o.payload_attach(module, &module_dtor_marker);
    
    RETVAL = o.ref();
}

string Module::name ()

Level Module::level ()

bool Module::passthrough ()

void Module::set_level (Level level)

void Module::set_logger (ILoggerSP logger, bool passthrough = false)

void Module::set_formatter (IFormatterSP formatter)

ILoggerSP Module::get_logger ()

IFormatterSP Module::get_formatter ()