summaryrefslogtreecommitdiffstats
path: root/lib/Spreadsheet/Template/Helpers/Xslate.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Spreadsheet/Template/Helpers/Xslate.pm')
-rw-r--r--lib/Spreadsheet/Template/Helpers/Xslate.pm65
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;