The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package SnipMate::Index;

use 5.14.0;

use strict;
use warnings;

use Method::Signatures;

use Moose;

use MooseX::Types::Path::Class;

use SnipMate::Snippets;

use Template::Caribou::Utils;
use Template::Caribou::Tags::HTML qw/ :all /;

with 'Template::Caribou';

has 'snippet_dir' => (
    isa => 'Path::Class::Dir',
    is => 'ro',
    default => $ENV{HOME}.'/.vim/snippets',
    coerce => 1,
);

has snippet_files => (
    is => 'ro',
    traits => [ 'Array' ],
    lazy => 1,
    default => sub {[
        map  { Path::Class::file($_) }
        grep { /\.snippets$/ }
        $_[0]->snippet_dir->children
    ]},
    handles => {
        'all_snippet_files' => 'elements'
    },
);

template webpage => method {
    html { body { ul { 
        li {
            anchor $_->basename.'.html' => $_->basename;
        } for $self->all_snippet_files;
    } } }
};

method generate_pages {
    for ( $self->all_snippet_files ) {
        generate_snippet_file( $_, $_->basename . '.html' );
    }
}

sub generate_snippet_file {
    my ( $src, $dest ) = @_;
    open my $fh, '>', $dest or die $!;

    print $fh SnipMate::Snippets->new( snippet_file => $src)
                    ->render('webpage');
}

__PACKAGE__->meta->make_immutable;

1;