diff options
Diffstat (limited to 'lib/Spreadsheet/Template/Helpers/Xslate.pm')
-rw-r--r-- | lib/Spreadsheet/Template/Helpers/Xslate.pm | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/lib/Spreadsheet/Template/Helpers/Xslate.pm b/lib/Spreadsheet/Template/Helpers/Xslate.pm new file mode 100644 index 0000000..9776a3b --- /dev/null +++ b/lib/Spreadsheet/Template/Helpers/Xslate.pm @@ -0,0 +1,65 @@ +package Spreadsheet::Template::Helpers::Xslate; +use strict; +use warnings; + +use JSON; + +my $JSON = JSON->new; + +use Sub::Exporter 'build_exporter'; + +my $import = build_exporter({ + exports => [ + map { $_ => \&_curry_package } qw(format c true false) + ], + groups => { + default => [qw(format c true false)], + }, +}); + +my %formats; + +sub import { + my $caller = caller; + $formats{$caller} = {}; + goto $import; +} + +sub format { + my ($package, $name, $format) = @_; + $formats{$package}{$name} = $format; + return ''; +} + +sub c { + my ($package, $contents, $format, $type, %args) = @_; + + $type = 'string' unless defined $type; + + return $JSON->encode({ + contents => "$contents", + format => _formats($package, $format), + type => $type, + (defined $args{formula} + ? (formula => $args{formula}) + : ()), + }); +} + +sub true { JSON::true } +sub false { JSON::false } + +sub _formats { + my ($package, $format) = @_; + + return $format if ref($format); + + return $formats{$package}{$format}; +} + +sub _curry_package { + my ($package, $name) = @_; + return sub { $package->$name(@_) }; +} + +1; |