1package Git::SVN::Memoize::YAML; 2use warnings; 3use strict; 4use YAML::Any (); 5 6# based on Memoize::Storable. 7 8sub TIEHASH { 9my$package=shift; 10my$filename=shift; 11my$truehash= (-e $filename) ? YAML::Any::LoadFile($filename) : {}; 12my$self= {FILENAME =>$filename, H =>$truehash}; 13bless$self=>$package; 14} 15 16sub STORE { 17my$self=shift; 18$self->{H}{$_[0]} =$_[1]; 19} 20 21sub FETCH { 22my$self=shift; 23$self->{H}{$_[0]}; 24} 25 26sub EXISTS { 27my$self=shift; 28exists$self->{H}{$_[0]}; 29} 30 31sub DESTROY { 32my$self=shift; 33 YAML::Any::DumpFile($self->{FILENAME},$self->{H}); 34} 35 36sub SCALAR { 37my$self=shift; 38scalar(%{$self->{H}}); 39} 40 41sub FIRSTKEY { 42'Fake hash from Git::SVN::Memoize::YAML'; 43} 44 45sub NEXTKEY { 46undef; 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.