private static Field[] getParts(Class<?> clazz) {

		Field[] parts = MAPPING.get(clazz);
		if (parts != null) {
			return parts;
		}

		Map<String, Field> convertable = new HashMap<String, Field>();
		Class<?> c = clazz;

		do {

			Field[] fields = c.getDeclaredFields();
			for (Field field : fields) {

				Class<?> type = field.getType();
				if (!Converters.canConvert(type)) {
					throw new IllegalArgumentException(String.format("Only basic type can be a token part, %s detected", type));
				}

				TokenPart tp = field.getAnnotation(TokenPart.class);
				if (tp != null) {

					String name = tp.value();
					if (convertable.get(name) != null) {
						throw new RuntimeException("Two or more fields cannot be annotated with the same token part name");
					}

					field.setAccessible(true);

					convertable.put(name, field);
				}
			}

		} while ((c = c.getSuperclass()) != null);

		parts = convertable.values().toArray(new Field[convertable.size()]);
		MAPPING.put(clazz, parts);

		return parts;
	}