view Lib/IMPL/ORM.pm @ 59:0f3e369553bd

Rewritten property implementation (probably become slower but more flexible) Configuration infrastructure in progress (in the aspect of the lazy activation) Initial concept for the code generator
author wizard
date Tue, 09 Mar 2010 02:50:45 +0300
parents 16ada169ca75
children 2d1c3f713280
line wrap: on
line source

package IMPL::ORM;
use strict;
use warnings;

use base qw(IMPL::Object);
use IMPL::Class::Property;
use Scalar::Util qw(weaken refaddr);

use IMPL::Exception;

our $Depth = 1; # загружать объект + 1 уровень детей
our $UseProxy = 1;

BEGIN {
    private property _ObjectCache => prop_all;
    private property _MapInstances => prop_all;
    private property _WorkUnit => prop_all;
    public property Schema => prop_all;
}

sub ObjectInfoById {
    my ($this,$oid) = @_;
    
    return $this->_ObjectCache->{$oid};
}

sub ObjectInfo {
    my ($this,$inst) = @_;
    
    die new IMPL::InvalidOperationException("This method can be used only for a reference") unless ref $inst;
    
    return $this->_MapInstances->{refaddr $inst};
}


1;
__END__
=pod
=head1 SYNOPSIS

use IMPL::ORM::Sql;

my $DB = new IMPL::ORM::Sql("connection string");

local $IMPL::ORM::Depth = 1; # load childs only, no more

my $artist = $DB->Lookup( Artist => { name => 'Beatles' } );

my $order = new Order();
$order->AddItem($_) foreach $artist->Albums->List;

$DB->Save($order);

my $label = $artist->Albums->Index(0)->Label;

$DB->Populate($label); #load $label

=head1 DESCRIPTION
=head2 MEMBERS
=level 4
=back
=head2 Variables
=head2 INTERNALS
=head3 Object Representation

Каждый класс отображаемый в источник данных представляется в виде набора
сущностей, каждая из которых представляет состояние базового класса.

Foo         entityFoo
    Bar         entityBar
    Baz         entityBaz

При сохранении виртуальных свойств классов в соответствующих сущностях заводится
два поля - одно под сохранение собственного значения свойства, другое - для
хренеия виртуального значения.

Foo
    public virtual property Name => prop_all, {Type => String};
    
entityFoo
    string m_Name - собственное значение
    string v_Name - вртуальное значение
    
Каждый сохраненный объект в базе имеет собственный идентификатор.
Новые объекты идентификатора не имеют, до тех пор пока они не будут сохранены.

=head3 Object Cache

Для учета объектов, которые присутствуют в источнике данных используется кеш
объектов. Сюда попадают полученные из базы объекты, а также вновь добавленные
объекты.

ObjectInfo => {
    instance => weak ref
    _id => data source dependent id
    state => {persistent|null|new|deleted}
    work_unit => ref to the work unit where object is acting
}

данная структура доступна через две функции ObjectInfoById и ObjectInfo

=head3 Type mapping

Источник данных имеет в себе схему данных, которая определяет набор типов,
хранимых в данном источнике. Есть несколько видов отображения типов:

=level 4

=item 1

Отображение классов, когда класс рассмаривается в иде набора свойств

=item

Отображение классов в одно значение (напрмер строку, данные и т.п.)

=item

Классы, которые на прямую работают с источником данных, такие как коллекции.

=back

=cut