use v5.14;
use warnings;
package Pantry::Model::DataBag;
# ABSTRACT: Pantry data model for Chef data bags
our $VERSION = '0.012'; # VERSION
use Moose 2;
use MooseX::Types::Path::Class::MoreCoercions qw/File/;
use Carp qw/croak/;
use List::AllUtils qw/uniq first/;
use Pantry::Model::EnvRunList;
use Pantry::Model::Util qw/hash_to_dot dot_to_hash/;
use namespace::autoclean;
# new_from_file, save_as
with 'Pantry::Role::Serializable' => {
freezer => '_freeze',
thawer => '_thaw',
};
#--------------------------------------------------------------------------#
# Chef role attributes
#--------------------------------------------------------------------------#
has _path => (
is => 'ro',
reader => 'path',
isa => File,
coerce => 1,
predicate => 'has_path',
);
has name => (
is => 'ro',
isa => 'Str',
required => 1,
);
has description => (
is => 'ro',
isa => 'Str',
lazy_build => 1,
);
sub _build_description {
my $self = shift;
return "The " . $self->name . " data bag";
}
has attributes => (
is => 'bare',
isa => 'HashRef',
traits => ['Hash'],
default => sub { +{} },
handles => {
set_attribute => 'set',
get_attribute => 'get',
delete_attribute => 'delete',
},
);
sub save {
my ($self) = @_;
die "No _path attribute set" unless $self->has_path;
return $self->save_as( $self->path );
}
my @top_level_keys = qw/id/;
sub _freeze {
my ($self, $data) = @_;
my $id = delete $data->{name};
my $attr = delete $data->{attributes};
for my $k ( keys %$attr ) {
next if grep { $k eq $_ } @top_level_keys;
dot_to_hash($data, $k, $attr->{$k});
}
$data->{id} = $id;
return $data;
}
sub _thaw {
my ($self, $data) = @_;
my $attr = {};
for my $k ( keys %$data ) {
next if grep { $k eq $_ } @top_level_keys;
my $v = delete $data->{$k};
$k =~ s{\.}{\\.}g; # escape existing dots in key
for my $pair ( hash_to_dot($k, $v) ) {
my ($key, $value) = @$pair;
$attr->{$key} = $value;
}
}
$data->{attributes} = $attr;
$data->{name} = delete $data->{id};
return $data;
}
1;
# vim: ts=2 sts=2 sw=2 et:
__END__
=pod
=head1 NAME
Pantry::Model::DataBag - Pantry data model for Chef data bags
=head1 VERSION
version 0.012
=head1 DESCRIPTION
Under development.
=head1 ATTRIBUTES
=head2 attributes
This attribute holds data bag attribute data as key-value pairs. Keys may
be separated by a period to indicate nesting (literal periods must be
escaped by a backslash). Values should be scalars or array references.
=head1 METHODS
=head2 set_attribute
$role->set_attribute("shell", "/bin/bash");
Sets the role default attribute for the given key to the given value.
=head2 get_attribute
my $port = $role->get_attribute("shell");
Returns the bag attribute for the given key.
=head2 delete_attribute
$role->delete_attribute("shell");
Deletes the bag attribute for the given key.
=head2 save
Saves the node to a file in the pantry. If the private C<_path>
attribute has not been set, an exception is thrown.
=head1 AUTHOR
David Golden <dagolden@cpan.org>
=head1 COPYRIGHT AND LICENSE
This software is Copyright (c) 2011 by David Golden.
This is free software, licensed under:
The Apache License, Version 2.0, January 2004
=cut