package JIB::Config; use strict; use warnings; use Cwd; use Config; use Path::Class (); use base 'Object::Accessor'; my %config; my $Cwd = Path::Class::dir(cwd()); use constant SUBDIR_OF_ROOT => sub { shift()->root->subdir( shift() ) }; use constant SUBDIR_OF_META => sub { shift()->_meta_dir->subdir(shift() ) }; use constant SUBFILE_OF_META => sub { shift()->_meta_dir->file( shift() ) }; ### %config is initialized with a [ default_value => return value ] pair ### the default_value is the value of initalization, the return value is ### a subroutine that build the return value based on the objects /current/ ### value.. this allows subdirs to 'change' magically if a rootdir gets changed ### base dirs ### XXX touch the 'root' entry and the tests will run somewhere quite different! $config{'root'} = [ $Cwd->subdir('fr') ]; $config{'temp_dir'} = [ tmp => SUBDIR_OF_ROOT ]; $config{'bin_dir'} = [ $Config{bin} => SUBDIR_OF_ROOT ]; $config{'compile_dir'} = [ _builddir => sub { shift()->temp_dir->subdir( shift() ) } ]; ### repository dirs/files $config{'repo_pool'} = [ Path::Class::dir('jibs') ]; $config{'repo_index'} = [ Path::Class::dir('dists') ]; $config{'repo_index_file'} = [ Path::Class::file('index') ]; $config{'repo_index_groups'}= [ [map {Path::Class::dir($_)} qw(author name prefix)] ]; ### meta dirs/files ### These are dependant on the installation, so they are ### marked privata.. their public equivalents live in Installation.pm $config{'_meta_dir'} = [ Path::Class::dir('_jib') ]; $config{'_files_list'} = [ Path::Class::file('files.list') ]; $config{'_control'} = [ control => SUBDIR_OF_META ]; $config{'_alternatives'} = [ alternatives => SUBDIR_OF_META ]; $config{'_available'} = [ available => SUBFILE_OF_META ]; $config{'_registered_alternatives'} = [ 'registered-alternatives' => SUBFILE_OF_META ]; ### source package dirs $config{'jib_dir'} = [ Path::Class::dir('_jib') ]; ### XXX need cp -R functionality fixed proper to use this ;( #$config{'build_dir'} = $config{'jib_dir'}->subdir('build'); $config{'build_dir'} = [ Path::Class::dir('root-') ]; ### package files/extensions $config{'meta_ext'} = [ '.info' ]; $config{'meta_file'} = [ META => sub { $_[1] . $_[0]->meta_ext } ]; $config{'archive_data'} = [ 'data.tgz' ]; $config{'archive_control'} = [ 'control.tgz' ]; $config{'archive_ext'} = [ '.jib' ]; $config{'preinst'} = [ 'PREINST.pl' ]; $config{'postinst'} = [ 'POSTINST.pl' ]; $config{'prerm'} = [ 'PRERM.pl' ]; $config{'postrm'} = [ 'POSTRM.pl' ]; ### generate a list of methods ### see above for details for my $func ( keys %config ) { no strict 'refs'; *$func = sub { my $obj = shift; my $acc = '_'.$func; ### set the new value if provided $obj->$acc( $_[0] ) if @_; my $sub = $config{$func}->[1]; return $sub ? $sub->( $obj, $obj->$acc ) : $obj->$acc; } } =head2 $config = JIB::Config->new XXX Singleton =cut { my $Obj; sub new { return $Obj if $Obj; my $self = shift; $Obj = $self->SUPER::new(); for my $key ( keys %config ) { my $acc = '_'.$key; ### XXX allow handlers? $Obj->mk_accessors( $acc ); ### set to a sane default value $Obj->$acc( $config{$key}->[0] ); } return $Obj; } } ### add our own ls_accessors, so we don't give back the private accessors sub ls_all_accessors { sort keys %config } sub ls_accessors { grep { $_ !~ /^_/ } __PACKAGE__->ls_all_accessors } 1; # Local variables: # c-indentation-style: bsd # c-basic-offset: 4 # indent-tabs-mode: nil # End: # vim: expandtab shiftwidth=4: