@Callback
 public Object[] writeNFCData(Context contex, Arguments args) {
   if (args.count() == 1 && args.checkString(0).length() <= 1024) {
     NFCData = args.checkString(0);
     worldObj.setBlockMetadataWithNotify(this.xCoord, this.yCoord, this.zCoord, 1, 2);
   } else {
     new Exception("No arguments or data is bigger than 1024 characters.");
   }
   return null;
 }
 @Override
 @Optional.Method(modid = "OpenComputers")
 public Object[] invoke(final String method, final Context context, final Arguments args)
     throws Exception {
   final Object[] arguments = new Object[args.count()];
   for (int i = 0; i < args.count(); ++i) {
     if (args.isString(i)) {
       arguments[i] = args.checkString(i);
     } else {
       arguments[i] = args.checkAny(i);
     }
   }
   final Integer methodId = methodIds.get(method);
   if (methodId == null) {
     throw new NoSuchMethodError();
   }
   delayedCall =
       new Runnable() {
         @Override
         public void run() {
           if (Error == null) {
             // TODO The computer has already been saved when we get here
             // so we have to come up with some other way to tell the
             // computer that the command was a success *after* the move.
             // Possibly by saving a flag in this tile entity's nbt tag,
             // but I don't know how RiM saves the command block itself.
             // context.signal("carriage_moved", true);
           } else if (!Obstructed) {
             context.signal("carriage_moved", false, Error.getMessage());
           } else {
             context.signal(
                 "carriage_moved",
                 false,
                 Error.getMessage(),
                 ObstructionX,
                 ObstructionY,
                 ObstructionZ);
           }
         }
       };
   callMethod(methodId, arguments);
   return new Object[] {true};
 }