Module::New::File - Module::New::File documentation


Module-New documentation Contained in the Module-New distribution.

Index


Code Index:

NAME

Top

Module::New::File

SYNOPSIS

Top

  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
  };

FUNCTIONS TO DEFINE FILES

Top

file

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.

content

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.

AUTHOR

Top

Kenichi Ishigaki, <ishigaki@cpan.org>

COPYRIGHT AND LICENSE

Top


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__