The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
MODULE = Panda::Date                PACKAGE = Panda::Date
PROTOTYPES: DISABLE
#///////////////////////////// STATIC FUNCTIONS ///////////////////////////////////

DateRel *
rdate (SV* from = NULL, SV* till = NULL)
CODE:
    const char* CLASS = DATEREL_CLASS;
    if      (till) RETVAL = daterel_new(from, till);
    else if (from) RETVAL = daterel_new(from);
    else           RETVAL = new DateRel();
OUTPUT:
    RETVAL
    

DateRel *
rdate_const (SV* from = NULL, SV* till = NULL)
CODE:
    const char* CLASS = DATEREL_CLASS;
    if      (till) RETVAL = daterel_new(from, till);
    else if (from) RETVAL = daterel_new(from);
    else           RETVAL = new DateRel();
    RETVAL->isConst(true);
OUTPUT:
    RETVAL    

#///////////////////////////// OBJECT METHODS ///////////////////////////////////
MODULE = Panda::Date                PACKAGE = Panda::Date::Rel
PROTOTYPES: DISABLE

DateRel *
DateRel::new (SV* from = NULL, SV* till = NULL)
CODE:
    if      (till) RETVAL = daterel_new(from, till);
    else if (from) RETVAL = daterel_new(from);
    else           RETVAL = new DateRel();
OUTPUT:
    RETVAL


void
DateRel::set (SV* from, SV* till = NULL)
PPCODE:
    daterel_chkro(THIS);
    if (till != NULL) daterel_set(from, till, THIS);
    else daterel_set(from, THIS);


ptime_t
DateRel::sec (SV* newval = NULL)
ALIAS:
    second  = 1
    secs    = 2
    seconds = 3
CODE:
    if (newval) {
        daterel_chkro(THIS);
        THIS->sec(SvMIV(newval));
    }
    RETVAL = THIS->sec();
OUTPUT:
    RETVAL


ptime_t
DateRel::min (SV* newval = NULL)
ALIAS:
    mins    = 1
    minute  = 2
    minutes = 3
CODE:
    if (newval) {
        daterel_chkro(THIS);
        THIS->min(SvMIV(newval));
    }
    RETVAL = THIS->min();
OUTPUT:
    RETVAL


ptime_t
DateRel::hour (SV* newval = NULL)
ALIAS:
    hours = 1
CODE:
    if (newval) {
        daterel_chkro(THIS);
        THIS->hour(SvMIV(newval));
    }
    RETVAL = THIS->hour();
OUTPUT:
    RETVAL


ptime_t
DateRel::day (SV* newval = NULL)
ALIAS:
    days = 1
CODE:
    if (newval) {
        daterel_chkro(THIS);
        THIS->day(SvMIV(newval));
    }
    RETVAL = THIS->day();
OUTPUT:
    RETVAL


ptime_t
DateRel::month (SV* newval = NULL)
ALIAS:
    mon    = 1
    months = 2
    mons   = 3
CODE:
    if (newval) {
        daterel_chkro(THIS);
        THIS->month(SvMIV(newval));
    }
    RETVAL = THIS->month();
OUTPUT:
    RETVAL


ptime_t
DateRel::year (SV* newval = NULL)
ALIAS:
    years = 1
CODE:
    if (newval) {
        daterel_chkro(THIS);
        THIS->year(SvMIV(newval));
    }
    RETVAL = THIS->year();
OUTPUT:
    RETVAL


ptime_t
DateRel::to_sec ()
ALIAS:
    to_second  = 1
    to_secs    = 2
    to_seconds = 3
    duration   = 4
CODE:
    RETVAL = THIS->toSec();
OUTPUT:
    RETVAL


double
DateRel::to_min ()
ALIAS:
    to_minute  = 1
    to_mins    = 2
    to_minutes = 3
CODE:
    RETVAL = THIS->toMin();
OUTPUT:
    RETVAL


double
DateRel::to_hour ()
ALIAS:
    to_hours = 1
CODE:
    RETVAL = THIS->toHour();
OUTPUT:
    RETVAL


double
DateRel::to_day ()
ALIAS:
    to_days = 1
CODE:
    RETVAL = THIS->toDay();
OUTPUT:
    RETVAL


double
DateRel::to_month ()
ALIAS:
    to_mon    = 1
    to_months = 2
    to_mons   = 3
CODE:
    RETVAL = THIS->toMonth();
OUTPUT:
    RETVAL


double
DateRel::to_year ()
ALIAS:
    to_years = 1
CODE:
    RETVAL = THIS->toYear();
OUTPUT:
    RETVAL


const char*
DateRel::to_string (...)
ALIAS:
    as_string = 1
    string = 2
CODE:
    RETVAL = THIS->toString();
OUTPUT:
    RETVAL
    

bool
DateRel::to_bool (...)
CODE:
    RETVAL = !THIS->empty();
OUTPUT:
    RETVAL


ptime_t
DateRel::to_number (...)
CODE:
    RETVAL = THIS->toSec();
OUTPUT:
    RETVAL


DateRel*
DateRel::multiply_new (SV* arg, ...)
CODE:
    const char* CLASS = DATEREL_CLASS;
    if (!looks_like_number(arg)) croak("Panda::Date: cannot '*' on non-number");
    RETVAL = THIS->multiplyNew(SvNV(arg));
OUTPUT:
    RETVAL
    
    

SV*
DateRel::multiply (SV* arg, ...)
PPCODE:
    if (!looks_like_number(arg)) croak("Panda::Date: cannot '*' on non-number");
    daterel_chkro(THIS);
    THIS->multiply(SvNV(arg));
    XSRETURN(1);


DateRel*
DateRel::divide_new (SV* arg, bool reverse = false)
CODE:
    const char* CLASS = DATEREL_CLASS;
    if (!looks_like_number(arg)) croak("Panda::Date: cannot '/' on non-number");
    if (reverse) croak("Panda::Date: illegal divison $num/$reldate");
    RETVAL = THIS->divideNew(SvNV(arg));
OUTPUT:
    RETVAL


SV*
DateRel::divide (SV* arg, bool reverse = false)
PPCODE:
    if (!looks_like_number(arg)) croak("Panda::Date: cannot '/' on non-number");
    if (reverse) croak("Panda::Date: illegal divison $num/$reldate");
    daterel_chkro(THIS);
    THIS->divide(SvNV(arg));
    XSRETURN(1);


DateRel*
DateRel::add_new (SV* arg, ...)
CODE:
    const char* CLASS;
    DateRel* operand = NULL;
    
    if (sv_isobject(arg)) {
        if (sv_isa(arg, DATEREL_CLASS)) operand = (DateRel *) SvIV(SvRV(arg));
        else if (sv_isa(arg, DATE_CLASS)) {
            CLASS = DATE_CLASS;
            Date* date = (Date *) SvIV(SvRV(arg));
            RETVAL = (DateRel*) date->addNew(THIS);
        }
        else if (sv_isa(arg, DATEINT_CLASS)) {
            CLASS = DATEINT_CLASS;
            DateInt* idate = (DateInt *) SvIV(SvRV(arg));
            RETVAL = (DateRel*) idate->addNew(THIS);
        }
        else croak("Panda::Date: cannot '+' - unknown object type");
    }
    else {
        static DateRel acc;
        daterel_set(arg, &acc);
        operand = &acc;
    }
    
    if (operand != NULL) {
        CLASS = DATEREL_CLASS;
        RETVAL = THIS->addNew(operand);
    }
OUTPUT:
    RETVAL


SV*
DateRel::add (SV* arg, ...)
PPCODE:
    daterel_chkro(THIS);
    DateRel* operand;
    if (sv_isobject(arg)) {
        if (sv_isa(arg, DATEREL_CLASS)) operand = (DateRel *) SvIV(SvRV(arg));
        else croak("Panda::Date: cannot '+=' - object isn't a Panda::Date::Rel object");
    }
    else {
        static DateRel acc;
        daterel_set(arg, &acc);
        operand = &acc;
    }

    THIS->add(operand);
    XSRETURN(1);


DateRel*
DateRel::subtract_new (SV* arg, bool reverse = false)
CODE:
    const char* CLASS = DATEREL_CLASS;
    DateRel* operand;
    if (sv_isobject(arg)) {
        if (sv_isa(arg, DATEREL_CLASS)) operand = (DateRel *) SvIV(SvRV(arg));
        else croak("Panda::Date: cannot '-' - object isn't a Panda::Date::Rel object");
    }
    else {
        static DateRel acc;
        daterel_set(arg, &acc);
        operand = &acc;
    }
    
    RETVAL = reverse ? operand->subtractNew(THIS) : THIS->subtractNew(operand);
OUTPUT:
    RETVAL


SV*
DateRel::subtract (SV* arg, ...)
PPCODE:
    daterel_chkro(THIS);
    DateRel* operand;
    if (sv_isobject(arg)) {
        if (sv_isa(arg, DATEREL_CLASS)) operand = (DateRel *) SvIV(SvRV(arg));
        else croak("Panda::Date: cannot '-=' - object isn't a Panda::Date::Rel object");
    }
    else {
        static DateRel acc;
        daterel_set(arg, &acc);
        operand = &acc;
    }
    
    THIS->subtract(operand);
    XSRETURN(1);


DateRel*
DateRel::negative_new (...)
CODE:
    const char* CLASS = DATEREL_CLASS;
    RETVAL = THIS->negativeNew();
OUTPUT:
    RETVAL


SV*
DateRel::negative ()
PPCODE:
    daterel_chkro(THIS);
    THIS->negative();
    XSRETURN(1);


int
DateRel::compare (SV* arg, bool reverse)
CODE:
    DateRel* operand;
    if (sv_isobject(arg)) {
        if (sv_isa(arg, DATEREL_CLASS)) operand = (DateRel *) SvIV(SvRV(arg));
        else croak("Panda::Date: cannot '<=>' - object isn't a Panda::Date::Rel object");
    }
    else {
        static DateRel acc;
        daterel_set(arg, &acc);
        operand = &acc;
    }
    
    RETVAL = THIS->compare(operand);
    if (reverse) RETVAL = -RETVAL;
OUTPUT:
    RETVAL


bool
DateRel::equals (SV* arg, ...)
CODE:
    DateRel* operand;
    if (sv_isobject(arg)) {
        if (sv_isa(arg, DATEREL_CLASS)) operand = (DateRel *) SvIV(SvRV(arg));
        else croak("Panda::Date: cannot 'eq' - object isn't a Panda::Date::Rel object");
    }
    else {
        static DateRel acc;
        daterel_set(arg, &acc);
        operand = &acc;
    }
    RETVAL = THIS->equals(operand);
OUTPUT:
    RETVAL


bool
DateRel::is_const (SV* newval = NULL)
CODE:
    if (newval) {
        daterel_chkro(THIS);
        THIS->isConst(SvTRUE(newval));
    }
    RETVAL = THIS->isConst();
OUTPUT:
    RETVAL


void
DateRel::DESTROY ()