diff Lib/IMPL/ORM/Object.pm @ 29:37160f7c8edb

minor changes
author Sergey
date Wed, 21 Oct 2009 17:30:20 +0400
parents 6d33f75c6e1f
children dd4d72600c69
line wrap: on
line diff
--- a/Lib/IMPL/ORM/Object.pm	Mon Oct 19 04:13:54 2009 +0400
+++ b/Lib/IMPL/ORM/Object.pm	Wed Oct 21 17:30:20 2009 +0400
@@ -56,6 +56,7 @@
     
     my $schema = IMPL::ORM::Schema::Entity->new($self->entityName);
     
+    # для текущего класса, проходим по всем свойствам
     foreach my $ormProp (
         $self->get_meta(
             'IMPL::Class::PropertyInfo',
@@ -66,17 +67,35 @@
         )
     ){
         if ($ormProp->Mutators & prop_list) {
+            # отношение 1 ко многим
             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);
         }
     }
     
+    # Формируем отношения наследования
+    {
+        # локализуем прагму
+        no strict 'refs';
+        
+        my $class = ref $self || $self;
+        
+        # по всем классам
+        foreach my $super (grep $_->isa(__PACKAGE__), @{"${class}::ISA"}) {
+            my $type = $dataSchema->resolveType($super) or die new IMPL::InvalidOperationException("Failed to resolve a super class due building schema for a class", $class, $super);
+            $schema->appentChild(new IMPL::ORM::Schema::Relation::Subclass($type));
+        }
+    }
+    
     return $schema;
 }