package Lire::Config::VariableIndex;

use strict;

use base qw/Lire::Config::Index/;

use Lire::Utils qw/check_param check_object_param/;
use Carp;

=pod

=head1 NAME

Lire::Config::VariableIndex - Index of the available variables in a TableInfo

=head1 SYNOPSIS

  <lrcsml:reference name="name" index="categorical_variables" />
  <lrcsml:reference name="name" index="numerical_variables" />
  <lrcsml:reference name="name" index="variables" />

=head1 DESCRIPTION

This object make it possible to select a variable defined in a
TableInfo (usually created from a Lire::ReportSpec or coming from a
Lire::Report object).

=head2 new( $table_info, [ $type ] )

Creates a new VariableIndex which wraps the $table_info
Lire::Report::TableInfo object. The $type parameter can be either
'both', 'categorical' or 'numerical' depending on the kind of
variables one wants to select. Default to 'both'.

=head2 table_info()

Returns the Lire::Report::TableInfo object wrapped by this Index.

=head2 type()

Returns the type attribute.

=cut

sub new {
    my ( $class, $info, $type ) = @_;

    check_object_param( $info, 'info', 'Lire::Report::TableInfo' );
    $type ||= 'both';
    check_param( $type, 'type', qr/^(both|categorical|numerical)$/,
                 "'type' parameter should be either 'both', 'categorical' or 'numerical'" );

    return bless { '_info' => $info,
                   '_type' => $type,
                 }, $class;
}

sub table_info {
    return $_[0]{'_info'};
}

sub type {
    return $_[0]{'_type'};
}

sub has_entry {
    my ( $self, $name ) = @_;

    check_param( $name, 'name' );

    foreach my $col ( $self->{'_info'}->column_infos() ) {
        next if $self->{'_type'} ne 'both' && $col->class() ne $self->{'_type'};
        return 1 if $name eq $col->name();
    }

    return 0;
}

sub entries {
    my $self = $_[0];

    my @entries = ();
    foreach my $col ( $self->{'_info'}->column_infos() ) {
        next if $self->{'_type'} ne 'both' && $col->class() ne $self->{'_type'};
        push @entries, $col->name();
    }
    return \@entries;
}

sub get_ref {
    my ( $self, $name ) = @_;

    check_param( $name, 'name' );
    foreach my $col ( $self->{'_info'}->column_infos() ) {
        next if $self->{'_type'} ne 'both' && $col->class() ne $self->{'_type'};
        return $col if $name eq $col->name();
    }

    croak "no variable \"$name\"";
}

1;

__END__

=pod

=head1 SEE ALSO

 Lire::ReportSpec(3pm) Lire::Report::TableInfo(3pm) Lire:Config::Index(3pm)

=head1 AUTHOR

  Francis J. Lacoste <flacoste@logreport.org>

=head1 VERSION

$Id: VariableIndex.pm,v 1.3 2006/07/23 13:16:31 vanbaal Exp $

=head1 COPYRIGHT

Copyright (C) 2004 Stichting LogReport Foundation LogReport@LogReport.org

This file is part of Lire.

Lire is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program (see COPYING); if not, check with
http://www.gnu.org/copyleft/gpl.html.

=cut
