def add(self, *args, **kwargs):
    assert self.resp is None, "Transaction already committed"
    entity, av_pairs, args = None, [], list(args)
    if len(args):
      if isinstance(args[0], (int, long)): 
        " first arg is an entity or tempid"
        entity = E(args[0], tx=self)
      elif isinstance(args[0], E):
        " dont resuse entity from another tx"
        if args[0]._tx is self:
          entity  = args[0]
        else:
          if int(args[0]) > 0:
            " use the entity id on a new obj"
            entity = E(int(args[0]), tx=self)
          args[0] = None
      " drop the first arg"
      if entity is not None or args[0] in (None, False, 0):
        v = args.pop(0)
    " auto generate a temp id?"
    if entity is None:
      entity       = E(self.ctmpid, tx=self)
      self.ctmpid -= 1
    " a,v from kwargs"
    if len(args) == 0 and kwargs: 
      for a,v in kwargs.iteritems():
        self.addeav(entity, a, v)
    " a,v from args "
    if len(args):
      assert len(args) % 2 == 0, "imbalanced a,v in args: " % args
      for first, second in pairwise(args):
        if not first.startswith(':'): 
          first = ':' + first
        if not first.endswith('/'):
          " longhand used: blah/blah "
          if isinstance(second, list):
            for v in second:
              self.addeav(entity, first, v)
          else:
            self.addeav(entity, first, second)
          continue
        elif isinstance(second, dict):
          " shorthand used: blah/, dict "
          for a,v in second.iteritems():
            self.addeav(entity, "%s%s" % (first, a), v)
            continue
        elif isinstance(second, (list, tuple)):
          " shorthand used: blah/, list|tuple "
          for a,v in pairwise(second):
            self.addeav(entity, "%s%s" % (first, a), v)
            continue
        else:
          raise Exception, "invalid pair: %s : %s" % (first,second)
    "pass back the entity so it can be resolved after tx()"
    return entity