KiokuDB::Meta::Instance - L<Moose::Meta::Instnace> level support for lazy loading.


KiokuDB documentation Contained in the KiokuDB distribution.

Index


Code Index:

NAME

Top

KiokuDB::Meta::Instance - Moose::Meta::Instnace level support for lazy loading.

SYNOPSIS

Top

    # use KiokuDB::Meta::Attribute::Lazy

DESCRIPTION

Top

This role is applied to the meta instance class automatically by KiokuDB::Class. When it finds KiokuDB::Thunk objects in the low level attribute storage it will cause them to be loaded.

This allows your Moose::Meta::Attributes to remain oblivious to the fact that the value is deferred, making sure that all the type constraints, lazy defaults, and various other Moose features continue to work normally.


KiokuDB documentation Contained in the KiokuDB distribution.

#!/usr/bin/perl

package KiokuDB::Meta::Instance;
use Moose::Role;

use namespace::clean -except => 'meta';

around 'get_slot_value' => sub {
    my ( $next, $self, $instance, $slot, @args ) = @_;

    my $value = $self->$next($instance, $slot, @args);

    if ( ref($value) eq 'KiokuDB::Thunk' ) {
        $value = $value->vivify($instance);
    }

    return $value;
};

around 'inline_get_slot_value' => sub {
    my ( $next, $self, $instance_expr, $slot_expr, @args ) = @_;

    my $get_expr = $self->$next($instance_expr, $slot_expr, @args);

    return 'do {
                my $value = ' . $get_expr . ';
                if ( ref($value) eq "KiokuDB::Thunk" ) {
                        $value = $value->vivify(' . $instance_expr . ');
                }
                $value;
        }'
};

sub inline_get_is_lvalue { 0 }

__PACKAGE__

__END__