# 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 <karupa@cpan.org>
