Show
Ignore:
Timestamp:
10/07/08 15:48:46 (3 months ago)
Author:
bonnu
Message:

lang/perl/Method-Cached - derivation & syntax correct

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • lang/perl/Method-Cached/trunk/lib/Method/Cached2.pm

    r20848 r20895  
    66use Attribute::Handlers; 
    77use Carp qw/croak confess/; 
    8 use Digest::SHA qw/sha1_base64/; 
    9 use JSON::XS; 
    10 use Storable qw/freeze/; 
    118use UNIVERSAL::require; 
     9use Method::Cached::KeyRule; 
    1210 
    1311our $VERSION = '0.0103'; 
    1412 
    15 my %_domains; 
    16 my $_default_domain = { 
    17     storage_class   => 'Cache::FastMmap', 
    18     storage_args    => [ 
    19         share_file     => '/tmp/fastmmap-sharefile.bin', 
     13my %_DOMAINS; 
     14my $_DEFAULT_DOMAIN = { 
     15    storage_class => 'Cache::FastMmap', 
     16    storage_args  => [ 
     17        share_file     => '/tmp/fastmmap.bin', 
    2018        unlink_on_exit => 0, 
    2119    ], 
    22     key_regularizer => 'LIST', 
     20    key_rule      => 'LIST', 
    2321}; 
    2422 
     
    2725    $options = [ $options || () ] unless ref $options eq 'ARRAY'; 
    2826    my $name = $pkg . '::' . *{$symbol}{NAME}; 
    29     my ($domain_name, $expires, $regularizer) = _parse_option(@{ $options }); 
     27    my ($domain_name, $expires, $key_rule) = _parse_option(@{ $options }); 
    3028    no strict 'refs'; 
    3129    no warnings 'redefine'; 
    3230    *{$name} = sub { 
    33         my $domain = $_domains{$domain_name} 
    34             ? $_domains{$domain_name} 
    35             : $_default_domain; 
    36         $regularizer ||= $domain->{key_regularizer}; 
    37         my $key = _regularize($regularizer, $name, @_); 
     31        my $domain = $_DOMAINS{$domain_name} 
     32            ? $_DOMAINS{$domain_name} 
     33            : $_DEFAULT_DOMAIN; 
     34        $key_rule ||= $domain->{key_rule}; 
     35        my $key = Method::Cached::KeyRule::regularize($key_rule, $name, @_); 
    3836        my $storage = _storage($domain); 
    3937        my $ret = $storage->get($key); 
     
    5351    } 
    5452    if (exists $args{-default} && defined $args{-default}) { 
    55         my $domain = $args{-default}; 
    56         ref $domain eq 'HASH' or croak '-default option should be a hash reference'; 
    57         $class->default_domain($domain); 
     53        my $default = $args{-default}; 
     54        ref $default eq 'HASH' or croak '-default option should be a hash reference'; 
     55        $class->default_domain($default); 
    5856    } 
    5957} 
     
    6159sub default_domain { 
    6260    my $class = shift; 
    63     $_default_domain = { 
    64         %{ $_default_domain }, 
     61    $_DEFAULT_DOMAIN = { 
     62        %{ $_DEFAULT_DOMAIN }, 
    6563        %{ +shift }, 
    6664    }; 
     
    7068    my $class = shift; 
    7169    while (my ($name, $args) = splice @_, 0, 2) { 
    72         $_domains{$name} = $args; 
     70        if (exists $_DOMAINS{$name}) { 
     71            warn 'This domain has already been defined: ' . $name; 
     72            next; 
     73        } 
     74        $_DOMAINS{$name} = $args; 
    7375    } 
    7476} 
     
    7779    my $domain_name = ($_[0] =~ /^-?\d+$/) ? q{} : shift; 
    7880    my $expires     = shift || 0; 
    79     my $regularizer = shift || undef; 
    80     return ($domain_name, $expires, $regularizer); 
    81 } 
    82  
    83 sub _regularize { 
    84     my ($regularizer, $method_name) = splice @_, 0, 2; 
    85     ref $regularizer && return $regularizer->($method_name, @_); 
    86     no strict 'refs'; 
    87     $regularizer ||= 'LIST'; 
    88     return $method_name . &{$regularizer}(@_); 
     81    my $key_rule    = shift || undef; 
     82    return ($domain_name, $expires, $key_rule); 
    8983} 
    9084 
     
    9892} 
    9993 
    100 sub LIST { 
    101     my $method_name = shift; 
    102     local $^W = 0; 
    103     join chr(28), @_; 
    104 } 
    105  
    106 sub SERIALIZE { 
    107     my $method_name = shift; 
    108     local $^W = 0; 
    109     our $ENCODER ||= JSON::XS->new->convert_blessed(1); 
    110     *UNIVERSAL::TO_JSON = sub { freeze \@_ }; 
    111     my $json = $ENCODER->encode(\@_); 
    112     undef *UNIVERSAL::TO_JSON; 
    113     sha1_base64($json); 
    114 } 
    115  
    116941; 
    11795