Object::Attribute::Cached - cache complex object attributes


Object-Attribute-Cached documentation Contained in the Object-Attribute-Cached distribution.

Index


Code Index:

NAME

Top

Object::Attribute::Cached - cache complex object attributes

SYNOPSIS

Top

	use Object::Attribute::Cached
		attribute1 => sub { shift->some_complex_task },
		squared => sub { shift->{num} ** 2 },
		uptosquare => sub { 1 .. shift->squared },
		squaredsquared => sub { map $_ ** 2, shift->uptosquare };

DESCRIPTION

Top

This provides a simple interface to writing simple caching attribute methods.

It avoids having to write code like:

	sub parsed_query { 
		my $self = shift;
		$self->{_cached_parsed_query} ||= $self->parse_the_query;
		return $self->{_cached_parsed_query};
	}

Instead you can just declare:

	use Object::Attribute::Cached
		parsed_query => sub { shift->parse_the_query };




CAVEATS

Top

We try to allow an attribute to be a lists or hash and examine caller() to try to do the right thing. This will work for simple cases, but if you're running into problems, or trying to do something more complex, it's always safer to use references instead.

AUTHOR

Top

Tony Bowden

BUGS and QUERIES

Top

Please direct all correspondence regarding this module to: bug-Object-Attribute-Cached@rt.cpan.org

COPYRIGHT AND LICENSE

Top


Object-Attribute-Cached documentation Contained in the Object-Attribute-Cached distribution.
package Object::Attribute::Cached;

our $VERSION = '1.00';

use strict;
use warnings;

sub import {
  my ($self, @pairs) = @_;
  no strict 'refs';
  my $caller = caller();
  while (my ($method, $code) = splice (@pairs, 0,2)) {
    my $cache = "__cache_$method";
    *{"$caller\::$method"} = sub {
      my $self = shift;
      $self->{$cache} ||= [ $code->($self, @_) ];
      return @{ $self->{$cache} } if wantarray;
			return $self->{$cache}->[0];
    };
  };
}

1;