1f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabotpackage org.hamcrest.object;
2f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabot
3f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabotimport org.hamcrest.Description;
4f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabotimport org.hamcrest.Matcher;
5f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabotimport org.hamcrest.Factory;
6f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabotimport org.hamcrest.TypeSafeMatcher;
7f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabot
8f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabotpublic class IsCompatibleType<T> extends TypeSafeMatcher<Class<?>> {
9f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabot    private final Class<T> type;
10f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabot
11f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabot    public IsCompatibleType(Class<T> type) {
12f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabot        this.type = type;
13f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabot    }
14f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabot
15f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabot    public boolean matchesSafely(Class<?> cls) {
16f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabot        return type.isAssignableFrom(cls);
17f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabot    }
18f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabot
19f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabot    public void describeTo(Description description) {
20f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabot        description.appendText("type < ").appendText(type.getName());
21f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabot    }
22f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabot
23f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabot    @Factory
24f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabot    public static <T> Matcher<Class<?>> typeCompatibleWith(Class<T> baseType) {
25f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabot        return new IsCompatibleType<T>(baseType);
26f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabot    }
27f5e9a2415ec42c425c2bb17db46f2a9649992d80Brett Chabot}
28