DBIx-ObjectMapper

 view release on metacpan or  search on metacpan

lib/DBIx/ObjectMapper/Mapper/Instance.pm  view on Meta::CPAN

package DBIx::ObjectMapper::Mapper::Instance;
use strict;
use warnings;
use Carp::Clan qw/^DBIx::ObjectMapper/;
use Try::Tiny;
use Scalar::Util qw(refaddr weaken);
use Log::Any qw($log);
use DBIx::ObjectMapper::Utils;
use DBIx::ObjectMapper::Session::Array;

our $call = 0;
my %INSTANCES;
my %STATUS = (
    # "status" => "changable status"
    transient  => [ 'pending', 'persistent', 'detached' ],
    pending    => [ 'expired', 'detached' ],
    persistent => [ 'expired', 'detached' ],
    detached   => [],
    expired    => [ 'persistent', 'detached' ],
);

sub new {
    my ( $class, $instance ) = @_;
    return $class->get(refaddr($instance)) || $class->create($instance);
}

sub create {
    my ( $class, $instance ) = @_;

    my $self = bless {
        instance            => $instance,
        status              => 'transient',
        is_modified         => 0,
        modified_data       => +{},
        unit_of_work        => undef,
        identity_condition  => undef,
        relation_condition  => +{},
        primary_cache_key   => undef,
        unique_cache_keys   => [],
        save_many_to_many   => [],
        remove_many_to_many => [],
    }, $class;
    $INSTANCES{refaddr($instance)} = $self;
    $self->initialize;
    return $self;
}

sub initialize {
    my $self = shift;
    $self->init_identity_condition;
    $self->init_relation_identity_condition;
    $self->init_cache_keys;
    $self->{add_lazy_column} = [];
}

sub lazy_column {
    my ( $self, $name ) = @_;
    my $class_mapper = $self->instance->__class_mapper__;
    my %lazy_column = $class_mapper->attributes->lazy_column($name);
    for my $lc ( @{$self->{add_lazy_column}} ) {
        if( $name eq $lc->name ) {
            $lazy_column{$name} = $lc;
        }
    }
    return %lazy_column;
}



( run in 4.153 seconds using v1.01-cache-2.11-cpan-5837b0d9d2c )