#!/usr/bin/perl -w
# -*- perl -*-

#
# $Id: iterate_bbd,v 1.2 2007/08/07 22:37:50 eserte Exp $
# Author: Slaven Rezic
#
# Copyright (C) 2007 Slaven Rezic. All rights reserved.
# This program is free software; you can redistribute it and/or
# modify it under the same terms as Perl itself.
#
# Mail: slaven@rezic.de
# WWW:  http://www.rezic.de/eserte/
#

use strict;

use Getopt::Long;
use Object::Iterate qw(iterate);

use FindBin;
use lib ("$FindBin::RealBin/..",
	 "$FindBin::RealBin/../lib",
	);
use Strassen;

my $n;
my @M;
GetOptions('n'    => \$n,
	   'M=s@' => \@M,
	  )
    or usage();

for my $mod (@M) {
    eval "require $mod";
    die $@ if $@;
}

my $code = shift || usage();
my @files = @ARGV;
if (!@files) {
    usage();
}

my $sub = eval 'sub { ' . $code . ' }';
die $@ if $@ || !$sub;

for my $f (@files) {
    my $s = Strassen->new($f);
    iterate {
	$sub->($_);
	$s->set_current2($_);
    } $s;
    if (!$n) {
	$s->write("-");
    }
}

sub usage {
    die <<EOF;
usage: $0 [-M module [-M ...]] [-n] filtercode file ...
EOF
}

__END__

=head1 EXAMPLES

* Get a list of streets with german "artikels". Note that unlike perl,
  there must be a space between -M and the module name.

    miscsrc/iterate_bbd -n -M Strassen::Strasse 'print Strasse::de_artikel($_->[Strassen::NAME]) . " " . $_->[Strassen::NAME] . "\n"' data/strassen

* Do nothing (note that due to getopt limitations, there must be at
  least a space in the filtercode part):

    miscsrc/iterate_bbd ' ' data/strassen

=cut
