package org.etk.reflect.api.visit; import org.etk.reflect.api.ClassTypeInfo; import org.etk.reflect.api.definition.ClassKind; public enum HierarchyScope { CLASS() { @Override public <V extends HierarchyVisitor<V>> HierarchyVisitorStrategy<V> get() { return new HierarchyVisitorStrategy<V>() { boolean done = false; @Override protected boolean accept(ClassTypeInfo type) { if (done) { return false; } else { done = true; return true; } } @Override protected void leave(ClassTypeInfo type) { done = false; } }; }}, ANCESTORS() { @Override public <V extends HierarchyVisitor<V>> HierarchyVisitorStrategy<V> get() { @SuppressWarnings("unchecked") HierarchyVisitorStrategy<V> tmp = ancestors; return tmp; }}, ALL() { @Override public <V extends HierarchyVisitor<V>> HierarchyVisitorStrategy<V> get() { @SuppressWarnings("unchecked") HierarchyVisitorStrategy tmp = all; return tmp; }}, NOT_OBJECT() { @Override public <V extends HierarchyVisitor<V>> HierarchyVisitorStrategy<V> get() { @SuppressWarnings("unchecked") HierarchyVisitorStrategy tmp = notObject; return tmp; }} ; /** . */ private static final HierarchyVisitorStrategy ancestors = new HierarchyVisitorStrategy() { @Override protected boolean accept(ClassTypeInfo type) { return type.getKind() == ClassKind.CLASS; } }; /** . */ private static final HierarchyVisitorStrategy all = new HierarchyVisitorStrategy() { @Override protected boolean accept(ClassTypeInfo type) { return true; } }; /** . */ private static final HierarchyVisitorStrategy notObject = new HierarchyVisitorStrategy() { @Override protected boolean accept(ClassTypeInfo type) { return !type.getName().equals(Object.class.getName()); } }; public abstract <V extends HierarchyVisitor<V>> HierarchyVisitorStrategy<V> get(); }