1import java.lang.annotation.Documented;
2import java.lang.annotation.ElementType;
3import java.lang.annotation.Retention;
4import java.lang.annotation.RetentionPolicy;
5
6import javax.annotation.MatchesPattern;
7import javax.annotation.meta.TypeQualifier;
8import javax.annotation.meta.TypeQualifierValidator;
9import javax.annotation.meta.When;
10
11@Documented
12@TypeQualifier
13@MatchesPattern("[0-9]{16}")
14@Retention(RetentionPolicy.RUNTIME)
15public @interface CreditCardNumber {
16	class Checker implements TypeQualifierValidator<CreditCardNumber> {
17
18		public When forConstantValue(CreditCardNumber annotation, Object v) {
19			if (!(v instanceof String))
20				return When.NEVER;
21			String s = (String) v;
22			if (LuhnVerification.checkNumber(s))
23				return When.ALWAYS;
24			return When.NEVER;
25		}
26	}
27}
28