The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

package KiokuDB::Reference;
use Moose;

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

with qw(MooseX::Clone);

has id => (
    isa => "Str",
    is  => "rw",
    required => 1,
);

has is_weak => (
    isa => "Bool",
    is  => "rw",
);

sub STORABLE_freeze {
    my ( $self, $cloning ) = @_;


    join(",", $self->id, !!$self->is_weak); # FIXME broken
}

sub STORABLE_thaw {
    my ( $self, $cloning, $serialized ) = @_;

    my ( $id, $weak ) = ( $serialized =~ /^(.*?),(1?)$/ );

    $self->id($id);
    $self->is_weak(1) if $weak;

    return $self;
}

__PACKAGE__->meta->make_immutable;

__PACKAGE__

__END__

=pod

=head1 NAME

KiokuDB::Reference - A symbolic reference to another L<KiokuDB::Entry>.

=head1 SYNOPSIS

    my $ref = KiokuDB::Reference->new(
        id => $some_id,
    );

=head1 DESCRIPTION

This object serves as an internal marker to point to entries by UID.

The linker resolves these references by searching the live object set and
loading entries from the backend as necessary.

=head1 ATTRIBUTES

=over 4

=item id

The ID this entry refers to

=item is_weak

This reference is weak.

=back

=cut