package Lire::Config::ReferenceSpec;

use strict;

use Lire::Config::Reference;

=pod

=head1 NAME

Lire::Config::ReferenceSpec - SelectSpec which takes its options from an Index.

=head1 DESCRIPTION

This Lire::Config::TypeSpec is a SelectSpec which defines an option
for each available entry in the Index named on its index property..

=head2 new( 'name' => $name, 'index' => $index, ... )

Creates a new ReferenceSpec object. The available options will be
queried at run time under Index.

=cut

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

use Carp;

use Lire::Config::Index;
use Lire::Utils qw/check_param/;

sub new {
    my $self = shift->SUPER::new( @_ );

    my %args = @_;

    $self->index( $args{'index'} );


    return $self;
}

sub instance_class {
    return 'Lire::Config::Reference';
}

=pod

=head2 index( [ $new_index )

Returns (and optionnally change) the setting of the index
attributes.

=cut

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

    if ( @_ == 2 ) {
        check_param( $index, 'index' );
        $self->{'_index'} = $_[1];
    }

    return $self->{'_index'};
}

sub add {
    croak( 'Lire::Config::ReferenceSpec cannot contain any components' );
}

sub normalize {
    my ( $self, $val ) = @_;

    return undef unless defined $val;
    return undef unless Lire::Config::Index->has_index( $self->{'_index'} );

    return Lire::Config::Index->get_index( $self->{'_index'} )->has_entry( $val ) ? $val : undef;
}

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

    return () unless Lire::Config::Index->has_index( $self->{'_index'} );

    my $index = Lire::Config::Index->get_index( $self->{'_index'} );
    my @options = ();
    foreach my $name ( @{$index->entries()} ) {
        push @options,
          Lire::Config::OptionSpec->new( 'name' => $name );
    }
    return @options;
}

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

    return undef unless defined $name;
    return undef unless Lire::Config::Index->has_index( $self->{'_index'} );

    my $index = Lire::Config::Index->get_index( $self->{'_index'} );
    return undef unless $index->has_entry( $name );

    return $index->get_ref( $name );;
}

1;

__END__

=pod

=head1 SEE ALLO

 Lire::Config::ReportConfigIndex(3pm) Lire::Config::Index(3pm)

=head1 VERSION

$Id: ReferenceSpec.pm,v 1.2 2006/07/23 13:16:30 vanbaal Exp $

=head1 AUTHOR

  Francis J. Lacoste <flacoste@logreport.org>

=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
