package org.hamcrest.object;

import org.hamcrest.Description;
import org.hamcrest.Matcher;
import org.hamcrest.TypeSafeMatcher;

public class IsCompatibleType<T> extends TypeSafeMatcher<Class<?>> {
    
private final Class<T> type;
    

    
public IsCompatibleType(Class<T> type) {
        
this.type = type;
    
}
    

    
@Override
    
public boolean matchesSafely(Class<?> cls) {
        
return type.isAssignableFrom(cls);
    
}
    

    
@Override
    
public void describeMismatchSafely(Class<?> cls, Description mismatchDescription) {
      
mismatchDescription.appendValue(cls.getName());
    
}
    

    
@Override
    
public void describeTo(Description description) {
        
description.appendText("type < ").appendText(type.getName());
    
}
    

    
/**
     
* Creates a matcher of {@link Class} that matches when the specified baseType is
     
* assignable from the examined class.
     
* For example:
     
* <pre>assertThat(Integer.class, typeCompatibleWith(Number.class))</pre>
     
*
 

     
* @param baseType
     
*the base class to examine classes against
     
*/

    
public static <T> Matcher<Class<?>> typeCompatibleWith(Class<T> baseType) {
        
return new IsCompatibleType<T>(baseType);
    
}
}