bdaa817742d61fe1aeaaea910744b6e771301384
[gitmo/moose-website.git] / lib / Moose / Website.pm
1 package Moose::Website;
2 use Moose;
3 use MooseX::Types::Path::Class;
4
5 use Path::Class;
6 use Template;
7 use YAML::XS 'LoadFile';
8
9 use Moose::Website::I18N;
10 use Moose::Website::Resource::Templates;
11 use Moose::Website::Resource::WebFiles;
12
13 our $VERSION   = '0.01';
14 our $AUTHORITY = 'cpan:STEVAN';
15
16 with 'MooseX::Getopt';
17
18 has 'outdir' => (
19     is       => 'ro',
20     isa      => 'Path::Class::Dir',
21     coerce   => 1,
22     required => 1,
23 );
24
25 has 'locale' => (
26     is      => 'ro',
27     isa     => 'Str',
28     default => sub { 'en' },
29 );
30
31 has 'page_file' => (
32     is       => 'ro',
33     isa      => 'Path::Class::File',
34     coerce   => 1,
35     default  => sub {
36         file(__FILE__)->parent->parent->parent->file('data', 'pages.yml')
37     }
38 );
39
40 # ....
41
42 has 'template_resource' => (
43     traits  => [ 'NoGetopt' ],
44     is      => 'ro',
45     isa     => 'Moose::Website::Resource::Templates',
46     lazy    => 1,
47     default => sub {
48         Moose::Website::Resource::Templates->new
49     },
50     handles  => {
51         'template_root' => 'dir'
52     }
53 );
54
55 has 'web_file_resource' => (
56     traits  => [ 'NoGetopt' ],
57     is      => 'ro',
58     isa     => 'Moose::Website::Resource::WebFiles',
59     lazy    => 1,
60     default => sub {
61         Moose::Website::Resource::WebFiles->new
62     },
63 );
64
65 has 'i18n' => (
66     traits  => [ 'NoGetopt' ],
67     is      => 'ro',
68     isa     => 'Object',
69     lazy    => 1,
70     default => sub {
71         my $self = shift;
72         Moose::Website::I18N->get_handle( $self->locale )
73     }
74 );
75
76 has 'pages' => (
77     traits  => [ 'NoGetopt' ],
78     is      => 'ro',
79     isa     => 'ArrayRef[HashRef]',
80     lazy    => 1,
81     default => sub {
82         my $self = shift;
83         LoadFile( $self->page_file->stringify );
84     }
85 );
86
87 has 'tt' => (
88     traits  => [ 'NoGetopt' ],
89     is      => 'ro',
90     isa     => 'Template',
91     lazy    => 1,
92     default => sub {
93         my $self = shift;
94         Template->new(
95             INCLUDE_PATH => $self->template_root,
96             %{ $self->template_config }
97         )
98     }
99 );
100
101 has 'template_config' => (
102     traits  => [ 'NoGetopt' ],
103     is      => 'ro',
104     isa     => 'HashRef',
105     lazy    => 1,
106     default => sub { +{} },
107 );
108
109 sub log { shift; warn @_, "\n" }
110
111 sub run {
112     my $self = shift;
113
114     foreach my $page ( @{ $self->pages } ) {
115
116         my $outfile = $self->outdir->file( $page->{outfile} )->stringify;
117
118         $self->log( "Writing page " . $page->{name} . " to $outfile using template " . $page->{template} );
119
120         $self->tt->process(
121             $page->{template},
122             $self->build_template_params( current_page => $page ),
123             $outfile
124         ) || confess $self->tt->error;
125     }
126
127     $self->log( "Copying web resources to " . $self->outdir );
128     $self->web_file_resource->copy( to => $self->outdir );
129 }
130
131 sub build_template_params {
132     my ($self, %params) = @_;
133
134     $params{ pages }  = $self->pages;
135     $params{ loc }    = sub { $self->i18n->loc( @_ ) };
136     $params{ locale } = $self->locale;
137
138     \%params;
139 }
140
141
142 __PACKAGE__->meta->make_immutable;
143
144 no Moose; 1;
145
146 __END__
147
148 =pod
149
150 =head1 NAME
151
152 Moose::Website - A Moosey solution to this problem
153
154 =head1 SYNOPSIS
155
156   use Moose::Website;
157
158 =head1 DESCRIPTION
159
160 =head1 METHODS
161
162 =over 4
163
164 =item B<>
165
166 =back
167
168 =head1 BUGS
169
170 All complex software has bugs lurking in it, and this module is no
171 exception. If you find a bug please either email me, or add the bug
172 to cpan-RT.
173
174 =head1 AUTHOR
175
176 Stevan Little E<lt>stevan.little@iinteractive.comE<gt>
177
178 =head1 COPYRIGHT AND LICENSE
179
180 Copyright 2010 Infinity Interactive, Inc.
181
182 L<http://www.iinteractive.com>
183
184 This library is free software; you can redistribute it and/or modify
185 it under the same terms as Perl itself.
186
187 =cut