    public <T> boolean that(T actual, Matcher<? super T> matcher, String category, String reason, Object... messageParameters) {
        if (!matcher.matches(actual)) {
        	if (reason != null) {
        		errors.add(new I18nMessage(category, reason, messageParameters));
            } else {
                Description description = new ResourceBundleDescription();
                description.appendDescriptionOf(matcher);
                errors.add(new I18nMessage(description.toString(), category));
            }
            return false;
        }
        return true;
    }

    public <T> boolean that(T actual, Matcher<? super T> matcher, String category, String reason, Object... messageParameters) {
        if (!matcher.matches(actual)) {
        	if (reason != null) {
        		errors.add(new I18nMessage(category, reason, messageParameters));
            } else {
                Description description = new ResourceBundleDescription();
                description.appendDescriptionOf(matcher);
                errors.add(new I18nMessage(category, description.toString(), actual));
            }
            return false;
        }
        return true;
    }
