view Lib/IMPL/ORM/Object.pm @ 27:b544a772b654

ORM in progress
author Sergey
date Fri, 16 Oct 2009 16:37:53 +0400
parents fafe56cfcd69
children 6d33f75c6e1f
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;

BEGIN {
    private _direct property _entities => 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 ormGetSchema {
    my ($self) = @_;
    
    my $class = ref $self || $self;
    
    return $schemaCache{$class} if $schemaCache{$class};
    
    my %schema;
    
    foreach my $ormProp (
        $self->get_meta(
            'IMPL::Class::PropertyInfo',
            sub {
                UNIVERSAL::isa($_->Implementor, 'IMPL::ORM::Property' )
            },
            1
        )
    ){
        push @{$schema{$ormProp->Class}},{
            name => $ormProp->Name,
            virtual => $ormProp->Virtual,
            type => $ormProp->Type
        };
    }
    
    return ($schemaCache{$class} = \%schema);
}

1;

__END__

=pod

=head1 DESCRIPTION

Базовый объект для реляционного отображения,
содержит в себе реляционные записи представляющие данный объект.

=cut