Modifier.java

package uk.org.lidalia.lang;

import java.lang.reflect.Member;

/**
 * An enumeration of the various modifiers that can be applied to classes or members.
 */
public enum Modifier {

    PUBLIC {
        @Override
        public boolean existsOn(final Member modifiable) {
            return java.lang.reflect.Modifier.isPublic(modifiable.getModifiers());
        }

        @Override
        public boolean existsOn(final Class<?> modifiable) {
            return java.lang.reflect.Modifier.isPublic(modifiable.getModifiers());
        }
    },

    PRIVATE {
        @Override
        public boolean existsOn(final Member modifiable) {
            return java.lang.reflect.Modifier.isPrivate(modifiable.getModifiers());
        }

        @Override
        public boolean existsOn(final Class<?> modifiable) {
            return java.lang.reflect.Modifier.isPrivate(modifiable.getModifiers());
        }
    },

    PROTECTED {
        @Override
        public boolean existsOn(final Member modifiable) {
            return java.lang.reflect.Modifier.isProtected(modifiable.getModifiers());
        }

        @Override
        public boolean existsOn(final Class<?> modifiable) {
            return java.lang.reflect.Modifier.isProtected(modifiable.getModifiers());
        }
    },

    STATIC {
        @Override
        public boolean existsOn(final Member modifiable) {
            return java.lang.reflect.Modifier.isStatic(modifiable.getModifiers());
        }

        @Override
        public boolean existsOn(final Class<?> modifiable) {
            return java.lang.reflect.Modifier.isStatic(modifiable.getModifiers());
        }
    },

    FINAL {
        @Override
        public boolean existsOn(final Member modifiable) {
            return java.lang.reflect.Modifier.isFinal(modifiable.getModifiers());
        }

        @Override
        public boolean existsOn(final Class<?> modifiable) {
            return java.lang.reflect.Modifier.isFinal(modifiable.getModifiers());
        }
    },

    SYNCHRONIZED {
        @Override
        public boolean existsOn(final Member modifiable) {
            return java.lang.reflect.Modifier.isSynchronized(modifiable.getModifiers());
        }

        @Override
        public boolean existsOn(final Class<?> modifiable) {
            return java.lang.reflect.Modifier.isSynchronized(modifiable.getModifiers());
        }
    },

    VOLATILE {
        @Override
        public boolean existsOn(final Member modifiable) {
            return java.lang.reflect.Modifier.isVolatile(modifiable.getModifiers());
        }

        @Override
        public boolean existsOn(final Class<?> modifiable) {
            return java.lang.reflect.Modifier.isVolatile(modifiable.getModifiers());
        }
    },

    TRANSIENT {
        @Override
        public boolean existsOn(final Member modifiable) {
            return java.lang.reflect.Modifier.isTransient(modifiable.getModifiers());
        }

        @Override
        public boolean existsOn(final Class<?> modifiable) {
            return java.lang.reflect.Modifier.isTransient(modifiable.getModifiers());
        }
    },

    NATIVE {
        @Override
        public boolean existsOn(final Member modifiable) {
            return java.lang.reflect.Modifier.isNative(modifiable.getModifiers());
        }

        @Override
        public boolean existsOn(final Class<?> modifiable) {
            return java.lang.reflect.Modifier.isNative(modifiable.getModifiers());
        }
    },

    INTERFACE {
        @Override
        public boolean existsOn(final Member modifiable) {
            return java.lang.reflect.Modifier.isInterface(modifiable.getModifiers());
        }

        @Override
        public boolean existsOn(final Class<?> modifiable) {
            return java.lang.reflect.Modifier.isInterface(modifiable.getModifiers());
        }
    },

    ABSTRACT {
        @Override
        public boolean existsOn(final Member modifiable) {
            return java.lang.reflect.Modifier.isAbstract(modifiable.getModifiers());
        }

        @Override
        public boolean existsOn(final Class<?> modifiable) {
            return java.lang.reflect.Modifier.isAbstract(modifiable.getModifiers());
        }
    },

    STRICT {
        @Override
        public boolean existsOn(final Member modifiable) {
            return java.lang.reflect.Modifier.isStrict(modifiable.getModifiers());
        }

        @Override
        public boolean existsOn(final Class<?> modifiable) {
            return java.lang.reflect.Modifier.isStrict(modifiable.getModifiers());
        }
    };

    /**
     * @param modifiable - the member that may have this modifier
     * @return true if the member has this modifier, false otherwise
     */
    public abstract boolean existsOn(Member modifiable);

    /**
     * @param modifiable - the class that may have this modifier
     * @return true if the class has this modifier, false otherwise
     */
    public abstract boolean existsOn(Class<?> modifiable);
}