public function in( $column )
    {
        $args = func_get_args();
        if ( count( $args ) < 2 )
        {
            throw new ezcQueryVariableParameterException( 'in', count( $args ), 2 );
        }

        if ( is_array( $args[1] ) && count( $args[1] ) == 0 )
        {
            throw new ezcQueryInvalidParameterException( 'in', 2, 'empty array', 'non-empty array' );
        }

        $values = ezcQuerySelect::arrayFlatten( array_slice( $args, 1 ) );
        $values = $this->getIdentifiers( $values );
        $column = $this->getIdentifier( $column );

        if ( count( $values ) == 0 )
        {
            throw new ezcQueryVariableParameterException( 'in', count( $args ), 2 );
        }
        
        if ( $this->quoteValues )
        {
            foreach ( $values as $key => $value )
            {
                switch ( true )
                {
                    case is_int( $value ):
                    case is_float( $value ):
                    case $value instanceof ezcQuerySubSelect:
                        $values[$key] = (string) $value;
                        break;
                    default:
                        $values[$key] = $this->db->quote( $value );
                }
            }
        }
        
        if ( count( $values ) <= 1000 )
        {
            return "{$column} IN ( " . join( ', ', $values ) . ' )';
        }
        else
        {
            $expression = '( ';

            do {
                $bunch = array_slice( $values, 0, 1000 );
                $values = array_slice( $values, 1000 );

                $expression .= "{$column} IN ( " . join( ', ', $bunch ) . ' ) OR ';
            } while ( count( $values ) > 1000 );

            $expression .= "{$column} IN ( " . join( ', ', $values ) . ' ) )';

            return $expression;
        }
    }