Rand Stats

AttrX::Lazy

github:pierre-vigier

Perl6-AttrX::Lazy

Build Status

NAME

AttrX::Lazy

SYNOPSIS

Provide a functionality similar to lazy in perl 5 with Moo

DESCRIPTION

This module provides trait lazy. That trait will create a public accessor if attribute is private or replace the accessor if the attribute is public. A lazy attribute is read-onlu

Lazy attribute with call a builder the first time to calculate the value of an attribute if not defined, and store the value. It's especially useful for property of a class that take a long time to compute, as they will be evaluated only on demand, and only once.

An alternate way of doing a similat functionality would be to just create a public method with is cached trait, however, using lazy allow to give a value within the constructor, and never do the computation in that case

use AttrX::Lazy;

class Sample
    has $.attribute is lazy;

    method !build_attribute() {
        #heavy calculation
        return $value;
    }
}

is equivalent to

class Sample
    has $.attribute;

    method attribute() {
        unless $!attribute.defined {
            #heavy calculation
            $!attribute = $value;
        }
        $!attribute;
    }
}

The builder method name can be changed like the following:

use AttrX::Lazy;

class Sample
    has $.attribute is lazy( builder => 'my_custom_builder' );

    method !my_custom_builder() {
        #heavy calculation
        return $value;
    }
}

NOTES

Another approach to the same probleme here: https://github.com/jonathanstowe/Attribute-Lazy

Hopefully, lazyness of attribute at one point will be integrated in perl6 core, and AttrX::Lazy will become useless

MISC

To test the meta data of the modules, set environement variable PERL6_TEST_META to 1 On the Christmas version of perl, the module had no issue, but it's not working correctly anymore with precompilation as of today, waiting for a fix in rakudo, add no precompilation pragma

Author

Pierre VIGIER

License

Artistic License 2.0