1package Git::SVN::Memoize::YAML; 2use warnings; 3use strict; 4use YAML::Any (); 5 6# based on Memoize::Storable. 7 8sub TIEHASH { 9 my $package = shift; 10 my $filename = shift; 11 my $truehash = (-e $filename) ? YAML::Any::LoadFile($filename) : {}; 12 my $self = {FILENAME => $filename, H => $truehash}; 13 bless $self => $package; 14} 15 16sub STORE { 17 my $self = shift; 18 $self->{H}{$_[0]} = $_[1]; 19} 20 21sub FETCH { 22 my $self = shift; 23 $self->{H}{$_[0]}; 24} 25 26sub EXISTS { 27 my $self = shift; 28 exists $self->{H}{$_[0]}; 29} 30 31sub DESTROY { 32 my $self = shift; 33 YAML::Any::DumpFile($self->{FILENAME}, $self->{H}); 34} 35 36sub SCALAR { 37 my $self = shift; 38 scalar(%{$self->{H}}); 39} 40 41sub FIRSTKEY { 42 'Fake hash from Git::SVN::Memoize::YAML'; 43} 44 45sub NEXTKEY { 46 undef; 47} 48 491; 50__END__ 51 52=head1 NAME 53 54Git::SVN::Memoize::YAML - store Memoized data in YAML format 55 56=head1 SYNOPSIS 57 58 use Memoize; 59 use Git::SVN::Memoize::YAML; 60 61 tie my %cache => 'Git::SVN::Memoize::YAML', $filename; 62 memoize('slow_function', SCALAR_CACHE => [HASH => \%cache]); 63 slow_function(arguments); 64 65=head1 DESCRIPTION 66 67This module provides a class that can be used to tie a hash to a 68YAML file. The file is read when the hash is initialized and 69rewritten when the hash is destroyed. 70 71The intent is to allow L<Memoize> to back its cache with a file in 72YAML format, just like L<Memoize::Storable> allows L<Memoize> to 73back its cache with a file in Storable format. Unlike the Storable 74format, the YAML format is platform-independent and fairly stable. 75 76Carps on error. 77 78=head1 DIAGNOSTICS 79 80See L<YAML::Any>. 81 82=head1 DEPENDENCIES 83 84L<YAML::Any> from CPAN. 85 86=head1 INCOMPATIBILITIES 87 88None reported. 89 90=head1 BUGS 91 92The entire cache is read into a Perl hash when loading the file, 93so this is not very scalable. 94