use 5.008001;
use strict;
use warnings;

package Dancer2::Session::JSON;
# ABSTRACT: Dancer 2 session storage in files with JSON

our $VERSION = '0.003';

use Moo;
use Dancer2::Core::Types;
use JSON;

#--------------------------------------------------------------------------#
# Attributes
#--------------------------------------------------------------------------#

has _suffix => (
    is      => 'ro',
    isa     => Str,
    default => sub { ".json" },
);

has _encoder => (
    is      => 'lazy',
    isa     => InstanceOf ['JSON'],
    handles => {
        '_freeze' => 'encode',
        '_thaw'   => 'decode'
    },
);

sub _build__encoder {
    my ($self) = @_;
    return JSON->new->allow_blessed->convert_blessed;
}

#--------------------------------------------------------------------------#
# Role composition
#--------------------------------------------------------------------------#

with 'Dancer2::Core::Role::SessionFactory::File';

sub _freeze_to_handle {
    my ( $self, $fh, $data ) = @_;
    binmode $fh;
    print {$fh} $self->_freeze( +{ %{$data} } );
    return;
}

sub _thaw_from_handle {
    my ( $self, $fh ) = @_;
    binmode($fh);
    return $self->_thaw(
        do { local $/; <$fh> }
    );
}

1;

=pod

=encoding UTF-8

=head1 NAME

Dancer2::Session::JSON - Dancer 2 session storage in files with JSON

=head1 VERSION

version 0.003

=head1 DESCRIPTION

This module implements Dancer 2 session engine based on L<JSON> files.

This backend can be used in single-machine production environments, but two
things should be kept in mind: The content of the session files is not
encrypted or protected in anyway and old session files should be purged by a
CRON job.

=head1 CONFIGURATION

The setting B<session> should be set to C<JSON> in order to use this session
engine in a Dancer2 application.

Files will be stored to the value of the setting C<session_dir>, whose default
value is C<appdir/sessions>.

Here is an example configuration that use this session engine and stores session
files in /tmp/dancer-sessions

    session: "JSON"

    engines:
      session:
        JSON:
          session_dir: "/tmp/dancer-sessions"

=for :stopwords cpan testmatrix url bugtracker rt cpants kwalitee diff irc mailto metadata placeholders metacpan

=head1 SUPPORT

=head2 Bugs / Feature Requests

Please report any bugs or feature requests through the issue tracker
at L<https://github.com/PerlDancer/dancer2-session-json/issues>.
You will be notified automatically of any progress on your issue.

=head2 Source Code

This is open source software.  The code repository is available for
public review and contribution under the terms of the license.

L<https://github.com/PerlDancer/dancer2-session-json>

  git clone https://github.com/PerlDancer/dancer2-session-json.git

=head1 AUTHOR

David Golden <dagolden@cpan.org>

=head1 CONTRIBUTORS

=for stopwords Jason A. Crome Sawyer X

=over 4

=item *

Jason A. Crome <jason@crome-plated.com>

=item *

Sawyer X <xsawyerx@cpan.org>

=back

=head1 COPYRIGHT AND LICENSE

This software is Copyright (c) 2013 by David Golden.

This is free software, licensed under:

  The Apache License, Version 2.0, January 2004

=cut

__END__


# vim: ts=4 sts=4 sw=4 et:
