docs: @Override
      public <T> T asFacet(Class<T> facetType)
      {
          if (facetType == SpanProvider.class)
          {
              return facetType.cast(new SpanProviderFacet());
          }
  
          // TODO amzn/ion-java/issues/17 support seeking over InputStream
          if (_input instanceof FromByteArray)
          {
              if (facetType == SeekableReader.class)
              {
                  return facetType.cast(new SeekableReaderFacet());
              }
              if (facetType == RawValueSpanProvider.class)
              {
                  return facetType.cast(new RawValueSpanProviderFacet());
              }
          }
  
          if (facetType == _Private_ByteTransferReader.class)
          {
              // This is a rather sketchy use of Facets, since the availability
              // of the facet depends upon the current state of this subject,
              // and that can change over time.
  
              // TODO amzn/ion-java/issues/16 Our {@link #transferCurrentValue} doesn't handle
              //  field names and annotations.
  
              // Ensure there's a contiguous buffer we can copy.
              if (_input instanceof UnifiedInputStreamX.FromByteArray
                  && getTypeAnnotationSymbols().length == 0
                  && ! isInStruct())
              {
                  return facetType.cast(new ByteTransferReaderFacet());
              }
          }
  
          return super.asFacet(facetType);
      }