Back to documentation
package Statocles::App;
# ABSTRACT: Base role for Statocles applications
use Statocles::Base 'Role';
use Statocles::Link;
requires 'pages';
=attr site
The site this app is part of.
=cut
has site => (
is => 'rw',
isa => InstanceOf['Statocles::Site'],
);
=attr data
A hash of arbitrary data available to theme templates. This is a good place to
put extra structured data like social network links or make easy customizations
to themes like header image URLs.
=cut
has data => (
is => 'ro',
isa => HashRef,
default => sub { {} },
);
=attr url_root
The URL root of this application. All pages from this app will be under this
root. Use this to ensure two apps do not try to write the same path.
=cut
has url_root => (
is => 'ro',
isa => Str,
required => 1,
);
=method pages
my @pages = $app->pages;
Get the pages for this app. Must return a list of L<Statocles::Page> objects.
=cut
around pages => sub {
my ( $orig, $self, @args ) = @_;
my @pages = $self->$orig( @args );
# Add the url_root
my $url_root = $self->url_root;
for my $page ( @pages ) {
my @url_attrs = qw( path );
if ( $page->isa( 'Statocles::Page::List' ) ) {
push @url_attrs, qw( next prev );
}
for my $attr ( @url_attrs ) {
if ( $page->$attr && $page->$attr !~ /^$url_root/ ) {
$page->$attr( join "/", $url_root, $page->$attr );
}
}
}
return @pages;
};
=method url
my $app_url = $app->url( $path );
Get a URL to a page in this application. Prepends the app's L<url_root
attribute|/url_root> if necessary. Strips "index.html" if possible.
=cut
sub url {
my ( $self, $url ) = @_;
my $base = $self->url_root;
$url =~ s{/index[.]html$}{/};
# Remove the / from both sides of the join so we don't double up
$base =~ s{/$}{};
$url =~ s{^/}{};
return join "/", $base, $url;
}
=method link
my $link = $app->link( %args )
Create a link to a page in this application. C<%args> are attributes to be
given to L<Statocles::Link> constructor. The app's L<url_root
attribute|/url_root> is prepended, if necessary.
=cut
sub link {
my ( $self, %args ) = @_;
my $url_root = $self->url_root;
if ( $args{href} !~ /^$url_root/ ) {
$args{href} = $self->url( $args{href} );
}
return Statocles::Link->new( %args );
}
1;
__END__
=head1 SYNOPSIS
package MyApp;
use Statocles::Base 'Class';
with 'Statocles::App';
sub pages {
return Statocles::Page::Content->new(
path => '/index.html',
content => 'Hello, World',
);
}
=head1 DESCRIPTION
A Statocles App creates a set of L<pages|Statocles::Pages> that can then be
written to the filesystem (or served directly, if desired).
Pages can be created from L<documents|Statocles::Documents> stored in a
L<store|Statocles::Store> (see L<Statocles::Page::Document>), files stored in a
store (see L<Statocles::Page::File>), lists of content (see
L<Statocles::Page::List>), or anything at all (see
L<Statocles::Page::Content>).
=head1 INCLUDED APPS
These applications are included with the core Statocles distribution.
=over 4
=item L<Statocles::App::Blog>
=item L<Statocles::App::Plain>
=item L<Statocles::App::Static>
=item L<Statocles::App::Perldoc>
=back
=head1 SEE ALSO
=over 4
=item L<Statocles::Store>
=item L<Statocle::Page>
=back