private void processObjectLevelRule(ObjectSpecs objectSpecs, StructNode sourceNode)
      throws IOException {
    String ruleText = sourceNode.getName().substring(1).trim();
    Pair<PageRule, Map<String, String>> rule = findAndProcessRule(ruleText, sourceNode);

    pageSpecHandler.setGlobalVariable("objectName", objectSpecs.getObjectName(), sourceNode);

    List<StructNode> specNodes =
        rule.getKey()
            .apply(pageSpecHandler, ruleText, objectSpecs.getObjectName(), rule.getValue());

    SpecGroup specGroup = new SpecGroup();
    specGroup.setName(ruleText);
    objectSpecs.addSpecGroup(specGroup);

    for (StructNode specNode : specNodes) {
      specGroup.addSpec(
          pageSpecHandler
              .getSpecReader()
              .read(specNode.getName(), pageSpecHandler.getContextPath()));
    }
  }
  private Pair<PageRule, Map<String, String>> findAndProcessRule(
      String ruleText, StructNode ruleNode) {
    for (Pair<Rule, PageRule> rulePair : pageSpecHandler.getPageRules()) {
      Matcher matcher = rulePair.getKey().getPattern().matcher(ruleText);
      if (matcher.matches()) {
        int index = 1;

        Map<String, String> parameters = new HashMap<String, String>();

        for (String parameterName : rulePair.getKey().getParameters()) {
          String value = matcher.group(index);
          pageSpecHandler.setGlobalVariable(parameterName, value, ruleNode);

          parameters.put(parameterName, value);
          index += 1;
        }

        return new ImmutablePair<PageRule, Map<String, String>>(rulePair.getValue(), parameters);
      }
    }
    throw new SyntaxException(ruleNode, "Could find rule matching: " + ruleText);
  }