package SlackBuild::Config; use strict; use warnings; use parent 'Config::Parser::Ini'; use File::Spec; use feature 'state'; sub new { my $class = shift; state $level; $level++; my $self = $class->SUPER::new(@_); if ($level == 1) { my $rootdir = $self->get(qw(dir root)); foreach my $kw ($self->names_of('dir')) { next if $kw eq 'root'; my $subdir = $self->get('dir', $kw); unless (File::Spec->file_name_is_absolute($subdir)) { $self->set('dir', $kw, File::Spec->catfile($rootdir, $subdir)); } } } $level--; return $self; } sub check_dir { my ($self, $valref, $prev_value, $locus) = @_; my $val = $$valref; unless (-d $val) { $self->error("$val: directory does not exist", locus => $locus); return 0; } return 1; } 1; __DATA__ [core] image = STRING :mandatory verbose = NUMBER :mandatory 0 [dir] root = STRING :check=check_dir :mandatory /srv/slackbuild tmp = STRING :mandatory tmp log = STRING :mandatory log pkg = STRING :mandatory pkg spool = STRING :mandatory spool