Changeset 20895 for lang/perl/Method-Cached/trunk/lib/Method/Cached2.pm
- Timestamp:
- 10/07/08 15:48:46 (3 months ago)
- Files:
-
- 1 modified
Legend:
- Unmodified
- Added
- Removed
-
lang/perl/Method-Cached/trunk/lib/Method/Cached2.pm
r20848 r20895 6 6 use Attribute::Handlers; 7 7 use Carp qw/croak confess/; 8 use Digest::SHA qw/sha1_base64/;9 use JSON::XS;10 use Storable qw/freeze/;11 8 use UNIVERSAL::require; 9 use Method::Cached::KeyRule; 12 10 13 11 our $VERSION = '0.0103'; 14 12 15 my %_ domains;16 my $_ default_domain= {17 storage_class => 'Cache::FastMmap',18 storage_args => [19 share_file => '/tmp/fastmmap -sharefile.bin',13 my %_DOMAINS; 14 my $_DEFAULT_DOMAIN = { 15 storage_class => 'Cache::FastMmap', 16 storage_args => [ 17 share_file => '/tmp/fastmmap.bin', 20 18 unlink_on_exit => 0, 21 19 ], 22 key_r egularizer=> 'LIST',20 key_rule => 'LIST', 23 21 }; 24 22 … … 27 25 $options = [ $options || () ] unless ref $options eq 'ARRAY'; 28 26 my $name = $pkg . '::' . *{$symbol}{NAME}; 29 my ($domain_name, $expires, $ regularizer) = _parse_option(@{ $options });27 my ($domain_name, $expires, $key_rule) = _parse_option(@{ $options }); 30 28 no strict 'refs'; 31 29 no warnings 'redefine'; 32 30 *{$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, @_); 38 36 my $storage = _storage($domain); 39 37 my $ret = $storage->get($key); … … 53 51 } 54 52 if (exists $args{-default} && defined $args{-default}) { 55 my $d omain= $args{-default};56 ref $d omaineq 'HASH' or croak '-default option should be a hash reference';57 $class->default_domain($d omain);53 my $default = $args{-default}; 54 ref $default eq 'HASH' or croak '-default option should be a hash reference'; 55 $class->default_domain($default); 58 56 } 59 57 } … … 61 59 sub default_domain { 62 60 my $class = shift; 63 $_ default_domain= {64 %{ $_ default_domain},61 $_DEFAULT_DOMAIN = { 62 %{ $_DEFAULT_DOMAIN }, 65 63 %{ +shift }, 66 64 }; … … 70 68 my $class = shift; 71 69 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; 73 75 } 74 76 } … … 77 79 my $domain_name = ($_[0] =~ /^-?\d+$/) ? q{} : shift; 78 80 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); 89 83 } 90 84 … … 98 92 } 99 93 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 116 94 1; 117 95
![(please configure the [header_logo] section in trac.ini)](/share/chrome/site/your_project_logo.png)