[![Build Status](https://travis-ci.org/karupanerura/Cache-Keys-DSL.svg?branch=master)](https://travis-ci.org/karupanerura/Cache-Keys-DSL)
# NAME

Cache::Keys::DSL - Declare cache key generator by DSL

# SYNOPSIS

   package MyProj::Keys;
   use Cache::Keys::DSL base_version => 0.01; # base_version is optional

   key 'all_items';
   keygen 'item';

   keygen 'user';

   keygen with_version user_item => 0.01, sub {
       my ($user, $item) = @_;
       return $user->{id}, $item->{id};
   };

   1;

   package MyProj;
   use MyProj::Keys qw/key_for_all_items gen_key_for_item gen_key_for_user gen_key_for_user_item/;

   sub search_all_items {
       my $key = key_for_all_items();
       $cache->get_or_set($key => sub { $dbh->selectall_arrayref('SELECT * FROM item ORDER BY id', { Slice => {} }) });
   }

   sub fetch_item_by_id {
       my $item_id = shift;
       my $key = gen_key_for_item($item_id);
       $cache->get_or_set($key => sub { $dbh->selectrow_hashref('SELECT * FROM item WHERE id = ?', undef, $item_id) });
   }

   sub fetch_user_by_id {
       my $user_id = shift;
       my $key = gen_key_for_user($user_id);
       $cache->get_or_set($key => sub { $dbh->selectrow_hashref('SELECT * FROM user WHERE id = ?', undef, $user_id) });
   }

   sub fetch_user_item {
       my ($user, $item) = @_;
       my $key = gen_key_for_user_item($user, $item);
       $cache->get_or_set($key => sub {
           $dbh->selectrow_hashref('SELECT * FROM user_item WHERE user_id = ? AND item_id = ?', undef, $user->{id}, $item->{id});
       });
   }

# DESCRIPTION

Cache::Keys::DSL provides DSL for declaring cache key.

# FUNCTIONS

- `key $name`

   For declaring static key.
   It generates exportable constant subroutine named `key_for_$name`.

- `keygen $name`

   For declaring dynamic key.
   It generates exportable subroutine named `gen_key_for_$name`.

- `with_version $name, $version`

   For declaring cache version.

# LICENSE

Copyright (C) karupanerura.

This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.

# AUTHOR

karupanerura <[email protected]>