I think it is a bit too much magic in there for me, and I also would want the _encode/_decode to work. The "object-wrapper" following is a workaround, maybe an ugly one and also maybe I am missing something. Well, all that said, you have working start here:
------- 8< ---------------------------------------- class Cal( Calendar.TimeRange _time, void|string cal_subtype, void|string lang) { array(int|string) _encode() { array(int|string) a = ({ _time->unix_time(), _time->calendar()->calendar_name(), cal_subtype, lang, _time->timezone()->zoneid }); return a; }
void _decode( array(int|string) a ) { [int t, string cal_type, cal_subtype, lang, string tz] = a; object/*Calendar.* */ c = Calendar[cal_type||"ISO"]; if(lang) c = c->set_language(lang); c = c->set_timezone(tz); if(cal_subtype) { // e.g. Calendar.ISO["Day"]( Calendar.ISO.Second( time() ) ) _time = c[cal_subtype](c->Second(t)); } else { _time = c->Second(t); } }
string _sprintf() { return _time->format_ymd(); } }
int main() { object x = Calendar.ISO.Second(); Cal c = Cal(x,"Second"); string y = encode_value(c); werror("%O\n", y); sleep(3); werror("%O\n", decode_value(y)); return 0; } ---------- 8< ----------------------------------------