code: @Override
      @SuppressWarnings("unchecked")
      @Scope(DocScope.IO)
      public <T> T projectDOMNode(final Node documentOrElement, final Class<T> projectionInterface) {
          ensureIsValidProjectionInterface(projectionInterface);
  
          if (documentOrElement == null) {
              throw new IllegalArgumentException("Parameter node must not be null");
          }
  
          final Map<Class<?>, Object> mixinsForProjection = mixins.containsKey(projectionInterface) ? Collections.unmodifiableMap(mixins.get(projectionInterface)) : Collections.<Class<?>, Object> emptyMap();
          final ProjectionInvocationHandler projectionInvocationHandler = new ProjectionInvocationHandler(XBProjector.this, documentOrElement, projectionInterface, mixinsForProjection, flags.contains(Flags.TO_STRING_RENDERS_XML), flags.contains(Flags.ABSENT_IS_EMPTY));
          final Set<Class<?>> interfaces = new HashSet<Class<?>>();
          interfaces.add(projectionInterface);
          interfaces.add(DOMAccess.class);
          interfaces.add(Serializable.class);
          if (flags.contains(Flags.SYNCHRONIZE_ON_DOCUMENTS)) {
              final Document document = DOMHelper.getOwnerDocumentFor(documentOrElement);
              InvocationHandler synchronizedInvocationHandler = new InvocationHandler() {
                  @Override
                  public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable {
                      synchronized (document) {
                          return projectionInvocationHandler.invoke(proxy, method, args);
                      }
                  }
              };
              return ((T) Proxy.newProxyInstance(projectionInterface.getClassLoader(), interfaces.toArray(new Class<?>[interfaces.size()]), synchronizedInvocationHandler));
          }
          return ((T) Proxy.newProxyInstance(projectionInterface.getClassLoader(), interfaces.toArray(new Class<?>[interfaces.size()]), projectionInvocationHandler));
      }
docs: {@inheritDoc}