壁紙チェンジャ

ついカッとなって書いた。書くものは何でもよかった。いまは反省している。

use strict;
use warnings;

use Data::Visitor::Callback;
use Imager;
use Win32::Wallpaper;
use YAML::Syck;

my $cfg = shift or die $!;
   $cfg = LoadFile $cfg;
   $cfg->{include} = LoadFile './cfg/include.yaml';

my $v = Data::Visitor::Callback->new(
    ignore_return_values => 1,
    value => sub {
        s/%%(.+?)%%/"\$cfg->{include}{process}$1"/ee;
    },
);
$v->visit($cfg);

my $target = $cfg->{wallpaper}{file} || $cfg->{include}{wallpaper}{file};
my $mode = $cfg->{wallpaper}{mode} || $cfg->{include}{wallpaper}{mode};

my $img = Imager->new or die $!;
$img->read(file => $cfg->{source}) or die $img->errstr;

foreach $_ ( @{ $cfg->{process} } ) {
    my ($method) = keys %{$_};
    my %args = %{ $_->{$method} };
    my $ctxt = delete $args{context} || '';
    $ctxt eq 'void' ? $img->$method(%args)
                    : $img = $img->$method(%args);
}

$img->write(file => $target);
wallpaper($target, $mode);