The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Plack::Middleware::Profiler::KYTProf::Profile::KVS;
use strict;
use warnings;

sub load {
    my $class = shift;
    $class->_add_kvs_profs;
}

sub _add_kvs_profs {
    my $class = shift;
    $class->_add_redis_prof;
}

sub _add_redis_prof {
    my $class = shift;

    for my $method (
        qw/
        set get incr decr exists del type
        rpush lpush llen lrange ltrim lindex lset lrem lpop rpop
        sadd scard sismember smembers spop srem sort
        /
        )
    {
        Devel::KYTProf->add_prof(
            'Redis', $method,
            sub {
                my ( $orig, $self, $key ) = @_;
                return [
                    '%s %s',
                    ['redis_method', 'redis_key'],
                    {
                        redis_method => $method,
                        redis_key => $key,
                    },
                ];
            }
        );
    }

    for my $method_multi (qw/ mget /) {
        Devel::KYTProf->add_prof(
            'Redis',
            $method_multi,
            sub {
                my ( $orig, $self, @args ) = @_;
                if ( ref $args[0] eq 'ARRAY' ) {
                    return [
                        '%s %s',
                        ['redis_method', 'redis_key'],
                        {
                            redis_method => $method_multi,
                            redis_key => join( ', ', map { $_->[0] } @args),
                        },
                    ];
                }
                else {
                    return [
                        '%s %s',
                        ['redis_method', 'redis_key'],
                        {
                            redis_method => $method_multi,
                            redis_key => join( ', ', map {ref($_) eq 'ARRAY' ? join(', ',@$_) : $_} @args),
                        },
                    ];
                }
            }
        );
    }
}

1;