public override Expression GenerateRead(Compilation.AstGenerator gen)
 {
     bool assign, post;
     var type = GetExpressionType(operation, out assign, out post);
     Expression ret;
     if (assign)
     {
         Assert.IsTrue(() => value is WritableNode);
         WritableNode writable = (WritableNode)value;
         if (post)
         {
             ParameterExpression temp = Expression.Variable(typeof(TotemObject), "temp");
             var read = value.GenerateRead(gen);
             ret = Expression.Block(
                 new ParameterExpression[] { temp },
                 Expression.Assign(temp, read),
                 writable.GenerateWrite(gen, ExpressionType.Assign, gen.Unary(type, read)),
                 temp
             );
         }
         else
         {
             var read = value.GenerateRead(gen);
             ret = writable.GenerateWrite(gen, ExpressionType.Assign, gen.Unary(type, read));
         }
     }
     else
         ret = gen.Unary(
             type,
             value.GenerateRead(gen)
         );
     return ret;
 }