package com.amadornes.framez.modifier; import java.util.ArrayList; import java.util.Collection; import java.util.List; import com.amadornes.framez.api.modifier.IFrameModifier; import com.amadornes.framez.api.movement.IFrame; import com.amadornes.jtraits.ClassFactory; import com.amadornes.jtraits.ITrait; public class FrameFactory { public static <T extends IFrame> T createFrame(Class<T> clazz, String identifier) { String mods = identifier.substring(identifier.lastIndexOf("_") + 1); List<IFrameModifier> modifierList = new ArrayList<IFrameModifier>(); int id = -1; while ((id = mods.indexOf("$")) >= 0 || mods.length() > 0) { String m = mods; if (id >= 0) { m = mods.substring(0, id); mods = mods.substring(id + 1); } else { mods = ""; } IFrameModifier mod = FrameModifierRegistry.instance().findModifier(m); if (mod == null) continue; modifierList.add(mod); } return createFrame(clazz, modifierList); } @SuppressWarnings("unchecked") public static <T extends IFrame> T createFrame(Class<T> clazz, List<IFrameModifier> mods) { List<Class<? extends ITrait>> traits = new ArrayList<Class<? extends ITrait>>(); for (IFrameModifier m : mods) if (m.getTraitClass() != null) traits.add(m.getTraitClass()); try { T frame = (T) ClassFactory.createClass(clazz, traits.toArray(new Class[] {})).newInstance(); frame.getModifiers().addAll(mods); return frame; } catch (Exception e) { e.printStackTrace(); } return null; } public static String getIdentifier(String prefix, Collection<IFrameModifier> mods) { StringBuilder sb = new StringBuilder(); if (prefix != null) sb.append(prefix + "_"); if (mods != null) for (IFrameModifier m : mods) sb.append(m.getType() + "$"); return sb.toString().substring(0, sb.length() - 1); } }