Yes, it was one of the issues that got hairy with the first Calendar module I wrote, if I remember correctly, so I really wanted to avoid that in the new version. (Not for cyclicness, mainly, just because of the remaining spaghetti.)
I don't really see why it should be cyclic even now when I look. Checking which variables aren't methods,
foreach (indices(o);;mixed ind)
{ mixed v=o[ind]; if (!functionp(v) || function_object(v)!=o) werror("%O:%O\n",ind,v); } "m":5 "y":2007 "split":0 "md":30 "mnd":31 "wd":3 "wy":2007 "yd":150 "jd":2454251 "yjd":2454102 "nw":-1000 "w":22 "n":1 "rules":Calendar.Ruleset() "is_day":1 "tzn":0 "utco":-1000 "is_ymd":1 "is_timerange":1
I don't get any wiser at all... rules does not have anything pointing back to the calendar, except the timezone, which should only have temporary objects (from Calendar.ISO_UTC).