The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Devel::WxProf::Preferences;
use strict; use warnings;
use YAML qw(LoadFile Dump);
use Fcntl;
use IO::File;
use File::HomeDir;
use File::Basename qw(dirname);
use Class::Std::Fast;
use version; our $VERSION = qv(0.0.1);

my @DYNAMIC_PREFERENCES = qw(
    default_dir
);
my $APP_NAME = 'wxprofile';

my %default_dir_of      :ATTR(:name<default_dir>        :default<()>);
my %map_font_size_of    :ATTR(:name<map_font_size>      :default<11>);
my %map_font_file_of    :ATTR(:name<map_font_file>      :default<'Vera.ttf'>);

sub get_data_dir {
    my $data_dir = File::HomeDir->my_data() . "/.$APP_NAME";
    return $data_dir if -d ($data_dir);
    mkdir $data_dir and return $data_dir;
    return;
}

sub get_font_dir {
    return dirname(__FILE__ ). '/Font';
}

sub BUILD {
    my ($self, $ident, $arg_ref) = @_;
    my $data_dir = File::HomeDir->my_data();
    if (-d "$data_dir/.$APP_NAME" ) {
        if (-r "$data_dir/.$APP_NAME/dynamic_preferences") {
            my $data_ref = eval {
                LoadFile("$data_dir/.$APP_NAME/dynamic_preferences")
            } || {};
            for my $name (keys( %{ $data_ref })) {
                if (my $method = $self->can("set_$name")) {
                    $method->($self, $data_ref->{ $name });
                }
            }
        }
    }
}

sub save_dynamic_preferences {
    my $self = shift;
    my $data_ref = {};
    my $data_dir = File::HomeDir->my_data();
    if (! -d "$data_dir/.$APP_NAME" ) {
        mkdir "$data_dir/.$APP_NAME" or return;
    }
    return if ! -w "$data_dir/.wxprofile";

    for my $name (@DYNAMIC_PREFERENCES) {
        if (my $method = $self->can("get_$name")) {
              $data_ref->{ $name } = $method->($self);
        }
        else {
            warn "unknown preference $name"
        }
    }
    my $fh = IO::File->new("$data_dir/.$APP_NAME/dynamic_preferences.$$",
        O_CREAT | O_WRONLY | O_EXCL
    ) or return;
    $fh->print(Dump($data_ref)) or return;
    $fh->close() or return;
    rename "$data_dir/.$APP_NAME/dynamic_preferences.$$"
        , "$data_dir/.$APP_NAME/dynamic_preferences"
}

sub DEMOLISH {
    my ($self) = @_;
    $self->save_dynamic_preferences();
}

1;