The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Data::Keys::E::Dir::Auto;

=head1 NAME

Data::Keys::E::Dir::Auto - auto create folder when needed

=head1 DESCRIPTION

When the key fails to do set a folder part from the key is extracted and when the
folder doesn't exist, it is created.

=cut

use warnings;
use strict;

our $VERSION = '0.02';

use Moose::Role;
use File::Basename 'dirname';
use Carp::Clan 'confess', 'croak';
use File::Path 'mkpath';

has 'auto_folders' => ( isa => 'Bool', is => 'rw', default => 1 );

requires('set');

around 'set' => sub {
	my $set   = shift;
	my $self  = shift;
	my $key   = shift;
	my $value = shift;
	
    # call set
    my $ret = eval { $self->$set($key, $value); };
	if ($@) {
	    my ($new_key, $filename) = $self->_make_filename($key);
        my $folder = dirname($filename);
        # check if we need to create a folder
        if (not -d $folder and $self->auto_folders) {
            mkpath($folder)
                or croak 'failed to store "'.$key.'", folder "'.$folder.'" could not be create - '.$!;
        }
		$ret = eval { $self->$set($key, $value); };
        croak $@
            if $@;
	}
    
    return $ret;
};

1;


__END__

=head1 AUTHOR

Jozef Kutej

=cut