OpenERP-OOM

 view release on metacpan or  search on metacpan

lib/OpenERP/OOM/Schema.pm  view on Meta::CPAN

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

=cut

use 5.010;
use Moose;
use OpenERP::XMLRPC::Client;

with 'OpenERP::OOM::DynamicUtils';
with 'OpenERP::OOM::Link::Provider';

has 'openerp_connect' => (
    isa => 'HashRef',
    is  => 'ro',
);

has 'link_config' => (
    isa => 'HashRef',
    is  => 'ro',
);

has link_provider => (
    isa => 'OpenERP::OOM::Link::Provider',
    is => 'ro',
    lazy_build => 1,
);

has 'client' => (
    isa     => 'OpenERP::XMLRPC::Client',
    is      => 'ro',
    lazy    => 1,
    builder => '_build_client',
);

has lang => (
    isa => 'Str',
    is => 'ro',
    default => 'en_GB',
);

sub _build_link_provider
{
    # we are also a link provider
    # so use that if one isn't provided.
    my $self = shift;
    return $self;
}

#-------------------------------------------------------------------------------

sub _build_client {
    my $self = shift;
    
    die 'Your config file has not been loaded or wired up correctly.' unless $self->openerp_connect;
    return OpenERP::XMLRPC::Client->new(%{$self->openerp_connect});
}


#-------------------------------------------------------------------------------

has _class_cache => (is => 'ro', isa => 'HashRef', default => sub { {} } );

sub class {
    my ($self, $class) = @_;
    
    if(exists $self->_class_cache->{$class})
    {
        return $self->_class_cache->{$class};
    }
    my $package = $self->meta->name . "::Class::$class";
    my $object_package = $self->meta->name . "::Object::$class";
    
    $self->ensure_class_loaded($package);
    $self->ensure_class_loaded($object_package);
    
    $self->_class_cache->{$class} = $package->new(
        schema => $self,
    );
    return $self->_class_cache->{$class};
}


#-------------------------------------------------------------------------------

sub link 
{
    my ($self, $class) = @_;

    return $self->link_provider->provide_link($class);
}

sub provide_link {
    my ($self, $class) = @_;
    
    my $package = ($class =~ /^\+/) ? $class : "OpenERP::OOM::Link::$class";

    $self->ensure_class_loaded($package);
    
    return $package->new(
        schema => $self,
        config => $self->link_config->{$class},
    );
}

sub timeout {
    my $self = shift;
    return $self->client->openerp_rpc->timeout(@_);
}

1;



( run in 3.086 seconds using v1.01-cache-2.11-cpan-97f6503c9c8 )