class Neo4jJsonCodec extends ObjectMapper {

    @Override
    public void writeValue( JsonGenerator out, Object value ) throws IOException
    {
        if ( value instanceof PropertyContainer )
        {
            try ( TransactionStateChecker txStateChecker = TransactionStateChecker.create( container ) )
            {
                writePropertyContainer( out, (PropertyContainer) value, txStateChecker );
            }
        }
        else if ( value instanceof Path )
        {
            try ( TransactionStateChecker txStateChecker = TransactionStateChecker.create( container ) )
            {
                writePath( out, ((Path) value).iterator(), txStateChecker );
            }
        }
        else if ( value instanceof Iterable )
        {
            writeIterator( out, ((Iterable) value).iterator() );
        }
        else if ( value instanceof byte[] )
        {
            writeByteArray( out, (byte[]) value );
        }
        else if ( value instanceof Map )
        {
            writeMap(out, (Map) value );
        }
        else if ( value instanceof Geometry )
        {
            Geometry geom = (Geometry) value;
            Object coordinates = (geom instanceof Point) ? ((Point) geom).getCoordinate() : geom.getCoordinates();
            writeMap( out, genericMap( new LinkedHashMap<>(), "type", geom.getGeometryType(), "coordinates", coordinates, "crs", geom.getCRS() ) );
        }
        else if ( value instanceof Coordinate )
        {
            Coordinate coordinate = (Coordinate) value;
            writeIterator( out, coordinate.getCoordinate().iterator() );
        }
        else if ( value instanceof CRS )
        {
            CRS crs = (CRS) value;
            writeMap( out, genericMap( new LinkedHashMap<>(), "srid", crs.getCode(), "name", crs.getType(), "type", "link", "properties",
                    genericMap( new LinkedHashMap<>(), "href", crs.getHref() + "ogcwkt/", "type", "ogcwkt" ) ) );
        }
        else if ( value instanceof Temporal || value instanceof TemporalAmount )
        {
            super.writeValue( out, value.toString() );
        }
        else if ( value != null && value.getClass().isArray() && supportedArrayType( value.getClass().getComponentType() ) )
        {
            writeReflectiveArray( out, value );
        }
        else
        {
            super.writeValue( out, value );
        }
    }

    public  Neo4jJsonCodec( TransitionalPeriodTransactionMessContainer container );
    public  Neo4jJsonCodec();

}