diff 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 diff
--- a/Lib/IMPL/ORM/Object.pm	Fri Oct 16 16:37:53 2009 +0400
+++ b/Lib/IMPL/ORM/Object.pm	Mon Oct 19 04:13:54 2009 +0400
@@ -7,9 +7,15 @@
 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;
@@ -36,18 +42,19 @@
     return $this->{$_entities}{$class} ? $this->{$_entities}{$class}->Get($prop,$value) : undef;
 }
 
-sub _PropertyImplementor {
-    'IMPL::ORM::Property'
+#sub _PropertyImplementor {
+#    'IMPL::ORM::Property'
+#}
+
+sub entityName {
+    (my $self = ref $_[0] || $_[0]) =~ s/::/_/g;
+    return $self;
 }
 
 sub ormGetSchema {
-    my ($self) = @_;
-    
-    my $class = ref $self || $self;
+    my ($self,$dataSchema) = @_;
     
-    return $schemaCache{$class} if $schemaCache{$class};
-    
-    my %schema;
+    my $schema = IMPL::ORM::Schema::Entity->new($self->entityName);
     
     foreach my $ormProp (
         $self->get_meta(
@@ -55,17 +62,22 @@
             sub {
                 UNIVERSAL::isa($_->Implementor, 'IMPL::ORM::Property' )
             },
-            1
+            0
         )
     ){
-        push @{$schema{$ormProp->Class}},{
-            name => $ormProp->Name,
-            virtual => $ormProp->Virtual,
-            type => $ormProp->Type
-        };
+        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 ($schemaCache{$class} = \%schema);
+    return $schema;
 }
 
 1;
@@ -79,4 +91,7 @@
 Базовый объект для реляционного отображения,
 содержит в себе реляционные записи представляющие данный объект.
 
+Каждый класс отображается в определенную сущность. Сущности хранят
+состояние объектов в том виде в котором удобно записывать в реляционную базу.
+
 =cut
\ No newline at end of file