Template::Plugin::Handy - handy vmethods for Template Toolkit


Template-Plugin-Handy documentation Contained in the Template-Plugin-Handy distribution.

Index


Code Index:

NAME

Top

Template::Plugin::Handy - handy vmethods for Template Toolkit

SYNOPSIS

Top

 [% USE Handy;
    mything.dump_data;
    mything.dump_stderr;
    mything.as_json;
 %]




DESCRIPTION

Top

Handy virtual methods I always use in my Template Toolkit files, especially for debugging.

METHODS

Top

Only new or overridden method are documented here.

dump_data

Replacement for the Dumper plugin. You can call this method on any variable to see its Data::Dump representation in HTML-safe manner.

 [% myvar.dump_data %]

dump_stderr

Like dump_data but prints to STDERR instead of returning HTML-escaped string. Returns undef.

as_json

Encode the variable as a JSON string. Wrapper around the JSON->encode method. The string will be encoded as UTF-8, and the special JSON flags for converted_blessed and allow_blessed are true by default.

increment( n )

Increment a scalar number by one. Aliased as a scalar vmethod as 'inc'.

decrement( n )

Decrement a scalar number by one. Aliased as a scalar vmethod as 'dec'.

sort_by( method_name )

Sort an array or hash ref of objects according to method_name. The sort assumes a cmp comparison and the return value of method_name is run through lc() first.

Returns a new sorted arrayref.

AUTHOR

Top

Peter Karman, <karman@cpan.org>

BUGS

Top

Please report any bugs or feature requests to bug-template-plugin-handy@rt.cpan.org, or through the web interface at http://rt.cpan.org. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.

ACKNOWLEDGEMENTS

Top

The Minnesota Supercomputing Institute http://www.msi.umn.edu/ sponsored the development of this software.

COPYRIGHT & LICENSE

Top


Template-Plugin-Handy documentation Contained in the Template-Plugin-Handy distribution.
package Template::Plugin::Handy;

use warnings;
use strict;
use base qw( Template::Plugin::VMethods );
use Carp;
use Data::Dump;
use JSON::XS;

our $VERSION = '0.003';

our @SCALAR_OPS = our @LIST_OPS = our @HASH_OPS
    = qw( as_json dump_stderr dump_data );
push( @SCALAR_OPS, qw( increment decrement ) );
push( @LIST_OPS,   qw( sort_by ) );
push( @HASH_OPS,   qw( sort_by ) );

# package object
my $JSON = JSON::XS->new;
$JSON->convert_blessed(1);
$JSON->allow_blessed(1);

# mysql serial fields are rendered with Math::BigInt objects in RDBO.
# monkeypatch per JSON::XS docs
sub Math::BigInt::TO_JSON {
    my ($self) = @_;
    return $self . '';
}

# same with URI objets
sub URI::TO_JSON {
    my ($uri) = @_;
    return $uri . '';
}

# virt method replacements for Dumper plugin
sub dump_data {
    my $s = shift;
    my $d = Data::Dump::dump($s);
    $d =~ s/&/&amp;/g;
    $d =~ s/</&lt;/g;
    $d =~ s/>/&gt;/g;
    $d =~ s,\n,<br/>\n,g;
    return "<pre>$d</pre>";
}

sub dump_stderr {
    my $s = shift;
    print STDERR Data::Dump::dump($s);
    return;
}

sub as_json {
    my $v = shift;
    if (@_) {
        $JSON->pretty(1);
    }
    my $j = $JSON->encode($v);
    if (@_) {
        $JSON->pretty(0);
    }
    return $j;
}

sub increment {
    $_[0]++;
    return;
}

sub decrement {
    $_[0]--;
    return;
}

sub sort_by {
    my $stuff  = shift;
    my $method = shift;
    if ( ref $stuff eq 'HASH' ) {
        return [
            sort {
                lc( $stuff->{$a}->$method ) cmp lc( $stuff->{$b}->$method )
                } keys %$stuff
        ];
    }
    elsif ( ref $stuff eq 'ARRAY' ) {
        return [ sort { lc( $a->$method ) cmp lc( $b->$method ) } @$stuff ];
    }
    elsif ( ref $stuff ) {

        # might be a single blessed object
        return $stuff;
    }
    else {
        croak "sort_by only works with ARRAY or HASH references";
    }

}

1;

__END__