=begin pod

=TITLE class Proxy

=SUBTITLE Item container with custom storage and retrieval

    class Proxy { ... }

A Proxy is an object that allows you to execute whenever a value is retrieved
from a container (C<FETCH>) or when it is set (C<STORE>).

To create a container that returns twice of what was stored in it, you do
something like this:

   sub double() is rw {
       my $storage = 0;
       Proxy.new(
           FETCH => method ()     { $storage },
           STORE => method ($new) { $storage = 2 * $new }
       )
    }
    my $doubled := double();
    $doubled = 4;
    say $doubled;       # 8

=head1 Methods

=head2 method new

    method new(:&FETCH!, :&STORE!) returns Proxy:D

Creates a new C<Proxy> object. C<&FETCH> is called with one argument (the
proxy object) when the value is accessed, and must return the value that the
fetch produces. C<&STORE> is called with two arguments (the proxy object, and
the new value) when a new value is stored in the container.

=end pod
