SL::Request: Funktion zum Cachen von Objekten für Dauer des Requests
authorMoritz Bunkus <m.bunkus@linet-services.de>
Mon, 16 Jun 2014 11:51:48 +0000 (13:51 +0200)
committerMoritz Bunkus <m.bunkus@linet-services.de>
Mon, 16 Jun 2014 12:12:46 +0000 (14:12 +0200)
SL/Request.pm

index 26be5f7..47f163c 100644 (file)
@@ -41,6 +41,17 @@ sub init_type {
   return 'html';
 }
 
+sub cache {
+  my ($self, $topic, $default) = @_;
+
+  $topic = '::' . (caller(0))[0] . "::$topic" unless $topic =~ m{^::};
+
+  $self->{_cache}           //= {};
+  $self->{_cache}->{$topic} //= ($default // {});
+
+  return $self->{_cache}->{$topic};
+}
+
 sub _store_value {
   my ($target, $key, $value) = @_;
   my @tokens = split /((?:\[\+?\])?(?:\.)|(?:\[\+?\]))/, $key;
@@ -533,6 +544,21 @@ of L<SL::Layout::Base>. Defaults to an isntance of L<SL::Layout::None>.
 
 For more information about layouts, see L<SL::Layout::Dispatcher>.
 
+=item C<cache $topic[, $default ]>
+
+Caches an item for the duration of the request. C<$topic> must be an
+index name referring to the thing to cache. It is used for retrieving
+it later on. If C<$topic> doesn't start with C<::> then the caller's
+package name is prepended to the topic. For example, if the a from
+package C<SL::StuffedStuff> calls with topic = C<get_stuff> then the
+actual key will be C<::SL::StuffedStuff::get_stuff>.
+
+If no item exists in the cache for C<$topic> then it is created and
+its initial value is set to C<$default>. If C<$default> is not given
+(undefined) then a new, empty hash reference is created.
+
+Returns the cached item.
+
 =back
 
 =head1 SPECIAL FUNCTIONS