anchor.diff:      return env.assign(node.variable, eval(node.value, env));
     }
   
  +  Value visitPropertyGet(PropertyGet node, env) {
  +    Value receiver = eval(node.receiver, env);
  +    return receiver.classDeclaration.lookupGetter(node.name)(receiver);
  +  }
  +
  +  Value visitPropertySet(PropertySet node, env) {
  +    Value receiver = eval(node.receiver, env);
  +    Value value = eval(node.value, env);
  +    receiver.classDeclaration.lookupSetter(node.name)(receiver, value);
  +    return value;
  +  }
  +
  +  Value visitDirectPropertyGet(DirectPropertyGet node, env) {
  +    Value receiver = eval(node.receiver, env);
  +    return receiver.classDeclaration.getProperty(receiver, node.target);
  +  }
  +
  +  Value visitDirectPropertySet(DirectPropertySet node, env) {
  +    Value receiver = eval(node.receiver, env);
  +    Value value = eval(node.value, env);
  +    receiver.classDeclaration.setProperty(receiver, node.target, value);
  +    return value;
  +  }
  +
  +  Value visitStaticGet(StaticGet node, env) => defaultExpression(node, env);
  +  Value visitStaticSet(StaticSet node, env) => defaultExpression(node, env);
  +
     Value visitStaticInvocation(StaticInvocation node, env) {
       if ('print' == node.name.toString()) {
         // Special evaluation of print.
  
positive.code:     'unary-': (NumValue v1) => -v1,
    };
  
    Value invokeMethod(String name, [Value arg]) {
      if (!operators.containsKey(name)) return notImplemented(obj: name);
      if (arg == null) return operators[name](this);
      return operators[name](this, arg);
    }
  
    // Operators
  
negative.code:     var receiver = eval(node.receiver, env);
      if (node.arguments.positional.isNotEmpty) {
        var argValue = eval(node.arguments.positional.first, env);
        return receiver.invokeMethod(node.name, argValue);
      } else {
        return receiver.invokeMethod(node.name);
      }
    }
  
    Value visitConstructorInvocation(ConstructorInvocation node, env) {
      ClassDeclaration classDeclaration =
          new ClassDeclaration(node.target.enclosingClass.reference);
  
      Environment emptyEnv = new Environment.empty();
      // Currently we don't support initializers.
      // TODO: Modify to respect dart semantics for initialization.
      //  1. Init fields and eval initializers, repeat the same with super.
      //  2. Eval the Function body of the constructor.
      List<Value> fields = classDeclaration.instanceFields
          .map((Field f) => eval(f.initializer, emptyEnv))
          .toList(growable: false);
  
      return new ObjectValue(classDeclaration, fields);
    }
  
    Value visitNot(Not node, env) {
      Value operand = eval(node.operand, env).toBoolean();
  