public int score(LuaValue value) {
   switch (value.type()) {
     case LuaValue.TTABLE:
       return value.length() == 0 ? 0 : componentCoercion.score(value.get(1));
     case LuaValue.TUSERDATA:
       return inheritanceLevels(componentType, value.touserdata().getClass().getComponentType());
     case LuaValue.TNIL:
       return SCORE_NULL_VALUE;
     default:
       return SCORE_UNCOERCIBLE;
   }
 }
 public int score(LuaValue value) {
   switch (value.type()) {
     case LuaValue.TNUMBER:
       return inheritanceLevels(targetType, value.isint() ? Integer.class : Double.class);
     case LuaValue.TBOOLEAN:
       return inheritanceLevels(targetType, Boolean.class);
     case LuaValue.TSTRING:
       return inheritanceLevels(targetType, String.class);
     case LuaValue.TUSERDATA:
       return inheritanceLevels(targetType, value.touserdata().getClass());
     case LuaValue.TNIL:
       return SCORE_NULL_VALUE;
     default:
       return inheritanceLevels(targetType, value.getClass());
   }
 }
 public Object coerce(LuaValue value) {
   switch (value.type()) {
     case LuaValue.TTABLE:
       {
         int n = value.length();
         Object a = Array.newInstance(componentType, n);
         for (int i = 0; i < n; i++) Array.set(a, i, componentCoercion.coerce(value.get(i + 1)));
         return a;
       }
     case LuaValue.TUSERDATA:
       return value.touserdata();
     case LuaValue.TNIL:
       return null;
     default:
       return null;
   }
 }