package Brackup::Metafile;
use strict;
use warnings;
use Carp qw(croak);

sub new {
    my ($class) = @_;
    return bless {}, $class;
}

sub open {
    my ($class, $file) = @_;
    unless (-e $file) {
        die "Unable to open metafile $file\n";
    }
    my $self = __PACKAGE__->new;
    $self->{filename} = $file;
    open $self->{fh}, "<", $file;
    $self->{linenum} = 0;
    return $self;
}

sub readline {
    my $self = shift;
    my $ret = {};
    my $line;  #
    my $fh = $self->{fh};
    while (defined ($line = <$fh>)) {
        $self->{linenum}++;
        if ($line =~ /^([\w\-]+):\s*(.+)/) {
            $ret->{$1} = $2;
            $self->{last} = \$ret->{$1};
            next;
        }
        if ($line eq "\n") {
            return $ret;
        }
        if ($line =~ /^\s+(.+)/) {
            die "Can't continue line without start" unless $self->{last};
            ${ $self->{last} } .= " $1";
            next;
        }

        $line =~ s/[:^print:]/?/g;
        die "Unexpected line in metafile $self->{file}, line $self->{linenum}: $line";
    }
    return undef;
}

1;


syntax highlighted by Code2HTML, v. 0.9.1