| Module-New documentation | Contained in the Module-New distribution. |
Module::New::File
package Your::Module::New::File::Something;
use Module::New::File;
file '{MAINFILE}' => content { return <<'TEMPLATE';
# following is a Mojo-like template for a module.
package <%= $c->module %>;
use strict;
use warnings;
sub new { bless {}, shift; }
1;
TEMPLATE
};
specifies the relative path of a file to create. {MAINFILE} becomes lib/Path/To/Module.pm you specified as a command line argument, and {MAINDIR} becomes lib/Path/To/Module.
just a syntax sugar of sub { }. The subroutine takes a context object, and should return a scalar text. Of course you can freely use template engines (you might want to extend the context to hold a template engine object to reuse). As of 0.02, Module::New uses Text::MicroTemplate, a fork of Mojo::Template by default.
Kenichi Ishigaki, <ishigaki@cpan.org>
Copyright (C) 2007-2009 by Kenichi Ishigaki.
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
| Module-New documentation | Contained in the Module-New distribution. |
package Module::New::File; use strict; use warnings; use Carp; use Module::New::Meta; my %stash; functions { file => sub ($$) { my ($name, $content) = @_; $stash{$name} = sub { $content->(@_) }; }, content => sub (&) { return shift }, }; methods { render => sub { my $class = shift; my $context = Module::New->context; my %hash; while ( my ($path, $content) = each %stash ) { while ( my ($name) = $path =~ /\{([A-Z_]+)\}/ ) { my $method = $context->can(lc $name); my $value = $method ? $context->$method : ''; $path =~ s/\{$name\}/$value/g; } # for backward compatibility my $template = $content->( $context ); $hash{$path} = $context->template->render( $template ); } %stash = (); return %hash; }, }; 1; __END__