public SchedulingPattern(String pattern) throws InvalidPatternException {
		this.asString = pattern;
		StringTokenizer st1 = new StringTokenizer(pattern, "|");
		if (st1.countTokens() < 1) {
			throw new InvalidPatternException("invalid pattern: \"" + pattern + "\"");
		}
		while (st1.hasMoreTokens()) {
			String localPattern = st1.nextToken();
			StringTokenizer st2 = new StringTokenizer(localPattern, " \t");
			if (st2.countTokens() != 5) {
				throw new InvalidPatternException("invalid pattern: \"" + localPattern + "\"");
			}
			try {
				minuteMatchers.add(buildValueMatcher(st2.nextToken(), MINUTE_VALUE_PARSER));
			} catch (Exception e) {
				throw new InvalidPatternException("invalid pattern \""
						+ localPattern + "\". Error parsing minutes field: "
						+ e.getMessage() + ".");
			}
			try {
				hourMatchers.add(buildValueMatcher(st2.nextToken(), HOUR_VALUE_PARSER));
			} catch (Exception e) {
				throw new InvalidPatternException("invalid pattern \""
						+ localPattern + "\". Error parsing hours field: "
						+ e.getMessage() + ".");
			}
			try {
				dayOfMonthMatchers.add(buildValueMatcher(st2.nextToken(), DAY_OF_MONTH_VALUE_PARSER));
			} catch (Exception e) {
				throw new InvalidPatternException("invalid pattern \""
						+ localPattern
						+ "\". Error parsing days of month field: "
						+ e.getMessage() + ".");
			}
			try {
				monthMatchers.add(buildValueMatcher(st2.nextToken(), MONTH_VALUE_PARSER));
			} catch (Exception e) {
				throw new InvalidPatternException("invalid pattern \""
						+ localPattern + "\". Error parsing months field: "
						+ e.getMessage() + ".");
			}
			try {
				dayOfWeekMatchers.add(buildValueMatcher(st2.nextToken(), DAY_OF_WEEK_VALUE_PARSER));
			} catch (Exception e) {
				throw new InvalidPatternException("invalid pattern \""
						+ localPattern
						+ "\". Error parsing days of week field: "
						+ e.getMessage() + ".");
			}
			matcherSize++;
		}
	}