@SuppressWarnings("unchecked")
  @Override
  public Iterator<V> allPrefixesOf(CharSequence key) {

    int len = key.length() - 1;
    if (len < 0) return AOpenIterator.<V>empty();

    Object[] ary = new Object[len + 1];
    int maxNode = -1;
    IARTNode current = root;
    for (int depth = 0; depth < len; depth++) {
      int index = key.charAt(depth);
      V x = (V) current.getValue(index);
      if (x != null) {
        maxNode = depth;
        ary[depth] = x;
      }

      current = ((IARTNodeN) current).findNode(index);
      if (current == null) return new ValueArrayIterator<V>(ary, maxNode);
    }

    V x = (V) current.getValue(key.charAt(len));
    if (x != null) {
      ary[len] = x;
      maxNode = len;
    }
    return new ValueArrayIterator<V>(ary, maxNode);
  }
 /*
  * (non-Javadoc)
  *
  * @see org.openl.types.ITypeLibrary#types()
  */
 @Override
 public Iterator<String> typeNames() {
   return AOpenIterator.select(super.typeNames(), selector);
 }