Mercurial > pub > Impl
view Lib/IMPL/ORM/Object.pm @ 28:6d33f75c6e1f
ORM in works
author | Sergey |
---|---|
date | Mon, 19 Oct 2009 04:13:54 +0400 |
parents | b544a772b654 |
children | 37160f7c8edb |
line wrap: on
line source
package IMPL::ORM::Object; use strict; use warnings; use base qw(IMPL::Object); use IMPL::Class::Property; use IMPL::Class::Property::Direct; require IMPL::ORM::Entity; require IMPL::ORM::Schema::Entity; require IMPL::ORM::Schema::Field; require IMPL::ORM::Schema::Relation::HasMany; require IMPL::ORM::Schema::Relation::HasOne; require IMPL::ORM::Schema::Relation::Subclass; BEGIN { private _direct property _entities => prop_all; public property objectType => prop_all; } my %schemaCache; sub CTOR { my ($this) = @_; while ( my ($class,$schema) = $this->ormGetSchema ) { $this->{$_entities}{$class} = new IMPL::ORM::Entity($class,$schema); } } sub ormStore { my ($this,$class,$prop,$value) = @_; die IMPL::InvalidOperationException("Cannot find entity for the specified class",$class) unless $this->{$_entities}{$class}; $this->{$_entities}{$class}->Store($prop,$value); } sub ormGet { my ($this,$class,$prop,$value) = @_; return $this->{$_entities}{$class} ? $this->{$_entities}{$class}->Get($prop,$value) : undef; } #sub _PropertyImplementor { # 'IMPL::ORM::Property' #} sub entityName { (my $self = ref $_[0] || $_[0]) =~ s/::/_/g; return $self; } sub ormGetSchema { my ($self,$dataSchema) = @_; my $schema = IMPL::ORM::Schema::Entity->new($self->entityName); foreach my $ormProp ( $self->get_meta( 'IMPL::Class::PropertyInfo', sub { UNIVERSAL::isa($_->Implementor, 'IMPL::ORM::Property' ) }, 0 ) ){ if ($ormProp->Mutators & prop_list) { my $type = $dataSchema->resolveType($ormProp->Type) or die new IMPL::InvalidOperationException("Failed to resolve a reference type due building schema for a class", $ormProp->Class, $ormProp->Name); $schema->appendChild( new IMPL::ORM::Schema::Relation::HasMany($ormProp->Name, $type->entityName) ); } elsif (my $type = $dataSchema->isValueType($ormProp->Type,'IMPL::ORM::Object')) { $schema->appendChild( new IMPL::ORM::Schema::Field($ormProp->Name,$type) ); } elsif (my $entity = $dataSchema->resolveType($ormProp->Type)) { $schema->appendChild( new IMPL::ORM::Schema::Relation::HasOne($ormProp->Name,$entity->entityName)); } else { die new IMPL::Exception('Uexpected error due building schema for a class', $ormProp->Class, $ormProp->Name); } } return $schema; } 1; __END__ =pod =head1 DESCRIPTION Базовый объект для реляционного отображения, содержит в себе реляционные записи представляющие данный объект. Каждый класс отображается в определенную сущность. Сущности хранят состояние объектов в том виде в котором удобно записывать в реляционную базу. =cut