+class If(object):
+ """Conditional actions."""
+
+ def __init__(self, cond, then, else_=None):
+ self.cond = cond
+ self.then = then
+ self.else_ = else_
+
+ def __getstate__(self):
+ if self.else_:
+ return [('cond', self.cond.expr),
+ ('then', self.then),
+ ('else', self.else_)]
+ else:
+ return [('cond', self.cond.expr), ('then', self.then)]
+
+ def __setstate__(self, state):
+ state = dict(state)
+ state["else_"] = state.pop("else", None)
+ state["cond"] = INumberDef(state["cond"])
+ self.__init__(**state)
+
+ @classmethod
+ def FromXML(cls, doc, element):
+ """Construct using an ElementTree-style element."""
+ else_ = None
+ for subelem in element.getchildren():
+ tag = realtag(subelem)
+ if tag == "cond":
+ cond = INumberDef(subelem.text)
+ elif tag == "then":
+ then = ActionDef.FromXML(doc, subelem)
+ elif tag == "else":
+ else_ = ActionDef.FromXML(doc, subelem)
+ try:
+ return cls(cond, then, else_)
+ except UnboundLocalError as exc:
+ raise ParseError(str(exc))
+
+ def __call__(self, owner, action, params, rank, created):
+ if self.cond(params, rank):
+ branch = self.then
+ else:
+ branch = self.else_
+
+ if branch:
+ return branch(owner, action, params, rank, created)
+
+ def __repr__(self):
+ if self.else_:
+ return "%s(%r, then=%r, else_=%r)" % (
+ type(self).__name__, self.cond, self.then, self.else_)
+ else:
+ return "%s(%r, then=%r)" % (
+ type(self).__name__, self.cond, self.then)
+