| File: | lib/Yukki/Role/Savable.pm |
| Coverage: | 64.1% |
| line | stmt | bran | cond | sub | pod | time | code |
|---|---|---|---|---|---|---|---|
| 1 | package Yukki::Role::Savable; | ||||||
| 2 | |||||||
| 3 | 4 4 | 14275 11 | use v5.24; | ||||
| 4 | 4 4 4 | 13 19 18 | use utf8; | ||||
| 5 | 4 4 4 | 53 5 19 | use Moo::Role; | ||||
| 6 | |||||||
| 7 | 4 4 4 | 1022 5 155 | use Scalar::Util qw( blessed ); | ||||
| 8 | 4 4 4 | 1425 11385 450 | use YAML qw( Dump Load ); | ||||
| 9 | |||||||
| 10 | # ABSTRACT: Provides a mechanism for YAML-izing objects | ||||||
| 11 | |||||||
| 12 - 44 | =head1 SYNOPSIS
package Yukki::Things;
use v5.24;
use Moo;
with 'Yukki::Role::Savable';
has foo => ( is => 'ro' );
has bar => ( is => 'ro' );
sub savable_attributes { qw( foo bar ) }
my $things = Yukki::Things->new(foo => 1, bar => 2);
path('file.yaml')->spew_utf8($things->dump_yaml);
my $things = Yukki::Things->load_yaml(path('file.yaml')->slurp_utf8);
say $things->foo; #> 1
say $things->bar; #> 2
=head1 DESCRIPTION
This is intended to provide L<Yukki> with a nice, neat way to save and load some configuration objects in a standard way.
=head1 REQUIRED METHODS
=head2 savable_attributes
my @attr = $obj->savable_attributes;
Returns the list of attributes to save in the YAML.
=cut | ||||||
| 45 | |||||||
| 46 | requires 'savable_attributes'; | ||||||
| 47 | |||||||
| 48 - 56 | =head1 METHODS =head2 dump_yaml my $yaml_text = $obj->dump_yaml; This converts the object to YAML and returns the ext. =cut | ||||||
| 57 | |||||||
| 58 | sub dump_yaml { | ||||||
| 59 | 0 | 1 | 0 | my $self = shift; | |||
| 60 | |||||||
| 61 | 0 | 0 | my %output; | ||||
| 62 | 0 | 0 | for my $attr ($self->savable_attributes) { | ||||
| 63 | 0 | 0 | my $v = $self->$attr; | ||||
| 64 | 0 | 0 | if (blessed $v && $v->does('Yukki::Role::Savable')) { | ||||
| 65 | 0 | 0 | $v = $v->dump_yaml; | ||||
| 66 | } | ||||||
| 67 | 0 | 0 | $output{ $attr } = $v; | ||||
| 68 | } | ||||||
| 69 | |||||||
| 70 | 0 | 0 | return Dump(\%output); | ||||
| 71 | } | ||||||
| 72 | |||||||
| 73 - 79 | =head2 load_yaml my $obj = $class->load_yaml($yaml_text); This constructs a new class from the data loaded from the given YAML text. =cut | ||||||
| 80 | |||||||
| 81 | sub load_yaml { | ||||||
| 82 | 1 | 1 | 138 | my ($class, $yaml) = @_; | |||
| 83 | |||||||
| 84 | 1 | 5 | my $input = Load($yaml); | ||||
| 85 | 1 | 2510 | $class->new($input); | ||||
| 86 | } | ||||||
| 87 | |||||||
| 88 | 1; | ||||||