The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Attribute::Memoize;

use warnings;
use strict;
use Attribute::Handlers;

our $VERSION = sprintf "%d.%02d", q$Revision: 1.1 $ =~ /(\d+)/g;

sub UNIVERSAL::Memoize :ATTR(CODE) {
	my ($pkg, $symbol, $options) = @_[0,1,4];
	$options = [ $options || () ] unless ref $options eq 'ARRAY';
	require Memoize;
	Memoize::memoize($pkg . '::' . *{$symbol}{NAME}, @$options);
}

"Rosebud"; # for MARCEL's sake, not 1 -- dankogai

__END__

=head1 NAME

Attribute::Memoize - A Memoize attribute

=head1 SYNOPSIS

  use Attribute::Memoize;

  sub fib :Memoize {
          my $n = shift;
          return $n if $n < 2;
          fib($n-1) + fib($n-2);
  }
  $|++;
  print fib($_),"\n" for 1..50;

=head1 DESCRIPTION

This attribute makes it slightly easier (and modern) to memoize a
function by providing an attribute, C<:Memoize> that makes it
unnecessary for you to explicitly call C<Memoize::memoize()>.
Options can be passed via the attribute per usual (see the
C<Attribute::Handlers> manpage for details, and the C<Memoize>
manpage for information on memoizing options):

  sub f :Memoize(NORMALIZER => 'main::normalize_f') {
  	...
  }

However, since the call to C<memoize()> is now done in a different
package, it is necessary to include the package name in any function
names passed as options to the attribute, as shown above.

=head1 BUGS

None known so far. If you find any bugs or oddities, please do inform the
author.

=head1 AUTHOR

Marcel Grunauer, <marcel@codewerk.com>

Dan Kogai, <dankogai@dan.co.jp>

=head1 COPYRIGHT

Copyright 2001 Marcel Grunauer.  All rights reserved.

Copyright 2006 Dan Kogai.  All rights reserved.

This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.

=head1 SEE ALSO

perl(1), L<Attribute::Handlers>, L<Memoize>

=cut