class Matcher extends InexactMatcher {
    Matcher(PropertyNameInfo propertyNameInfo) {
      super(propertyNameInfo);
    }

    boolean match() {<FILL_FUNCTION_BODY>}

    boolean matchLastDestTokens() {
      Tokens tokens = destTokens.get(destTokens.size() - 1);
      for (int destTokenIndex = 0; destTokenIndex < tokens.size(); destTokenIndex++) {
        DestTokensMatcher matchedTokens = matchSourcePropertyName(tokens, destTokenIndex);
        if (matchedTokens.match())
          return true;
        if (matchSourcePropertyType(tokens.token(destTokenIndex)) || matchSourceClass(tokens.token(destTokenIndex)))
          return true;
      }
      return false;
    }
  }

      if (!matchLastDestTokens())
        return false;

      for (Tokens destTokens : propertyNameInfo.getDestinationPropertyTokens()) {
        for (int destTokenIndex = 0; destTokenIndex < destTokens.size(); destTokenIndex++) {
          DestTokensMatcher matchedTokens = matchSourcePropertyName(destTokens, destTokenIndex);
          if (matchedTokens.match(sourceTokens.size() - 1))
            return true;
        }
      }

      return false;
    
<no_super_class>