/// Gets the object associated with the specified key in the dictionary.
  // The key is assumed to be a String, which is matched against
  // the wildcard-pattern keys in the dictionary.
  // @param key the string to match
  // @returns the element for the key, or null if there's no match
  // @see Acme.Utils#match
  public synchronized Object get(Object key) {

    String sKey = (String) key;
    // System.out.println("Trying "+sKey);
    int matching_len = -1, found = -1;
    // to optimize speed, keys should be sorted by length
    // TODO: above
    for (int i = keys.size() - 1; i > -1; i--) {
      String thisKey = (String) keys.elementAt(i);
      // System.out.println("Trying "+thisKey);
      if (Acme.Utils.match(thisKey, sKey)) {
        int current = Acme.Utils.matchSpan(thisKey, sKey);
        if (current > matching_len) {
          // System.out.println("using "+thisKey);
          found = i;
          matching_len = current;
        }
      }
    }
    if (found > -1) return elements.elementAt(found);
    return null;
  }
 // / Gets the object associated with the specified key in the dictionary.
 // The key is assumed to be a String, which is matched against
 // the wildcard-pattern keys in the dictionary.
 // @param key the string to match
 // @returns the element for the key, or null if there's no match
 // @see Acme.Utils#match
 @Override
 public synchronized Object get(Object key) {
   String sKey = (String) key;
   int matching_len = 0, found = -1;
   // to optimize speed, keys should be sorted by length
   // TODO: above
   for (int i = keys.size() - 1; i > -1; i--) {
     String thisKey = (String) keys.elementAt(i);
     int current = Acme.Utils.matchSpan(thisKey, sKey);
     if (current > matching_len) {
       found = i;
       matching_len = current;
     }
   }
   if (found > -1) return elements.elementAt(found);
   return null;
 }