Class::Persist::Proxy::Collection - Proxy for objects not loaded yet


Class-Persist documentation Contained in the Class-Persist distribution.

Index


Code Index:

NAME

Top

Class::Persist::Proxy::Collection - Proxy for objects not loaded yet

SYNOPSIS

Top

  use qw( Class::Persist::Proxy::Collection );
  my $proxy = Class::Persist::Proxy::Collection->new();
  $proxy->class('Class::Persist::Address');
  $proxy->owner( $contact );
  $proxy->push($object1, $object2);
  $proxy->store();
  $obj1 = $proxy->object_at_index(0);

DESCRIPTION

Top

  Replace several objects in the DB by a Proxy object.
  This allows delayed loading of objects.

INHERITANCE

Top

  Class::Persist::Proxy EO::Array

METHODS

Top

element

When called for the first time, create an array of proxies representing the real objects.

load()

Replace all the element by proxies

store()

Store any non proxy element in the collection and proxy it

delete( $index )

Without parameter, delete all the elements of the collection. If an index is given, deletes the related element.

SEE ALSO

Top

Class::Persist

AUTHOR

Top

Fotango


Class-Persist documentation Contained in the Class-Persist distribution.
package Class::Persist::Proxy::Collection;
use strict;
use warnings::register;
use base  qw( Class::Persist::Proxy EO::Array );


sub element {
  my $self = shift;
  if (@_) {
    return $self->SUPER::element( @_ );
  }

  $self->load() unless $self->{element};
  $self->SUPER::element;
}


sub load {
  my $self   = shift;
  my $class  = $self->class   or Class::Persist::Error::InvalidParameters->throw(text => "A class should be defined in proxy");
  $self->loadModule( $class ) or return;
  my $owner = $self->owner    or Class::Persist::Error::InvalidParameters->throw(text => "A owner should be defined in proxy");

  my $ids = $class->oids_for_owner( $owner );
  my @element;
  foreach my $id (@$ids) {
    my $proxy = Class::Persist::Proxy->new();
    $proxy->real_id( $id );
    $proxy->class( $class );
    CORE::push @element, $proxy;
  }
  $self->element(\@element);
}


sub store {
  my $self = shift;
  my $owner = $self->owner or Class::Persist::Error::InvalidParameters->throw(text => "A owner should be defined in proxy");
  if (my $element = $self->{element}) {
    foreach my $elem (@$element) {
      next if $elem->isa('Class::Persist::Proxy');
      $elem->owner( $owner );
      $elem->store();
      Class::Persist::Proxy->proxy( $elem );
    }
  }
  $self;
}

sub push {
  my $self = shift;
  my @elements = @_;
  $_->owner($self->owner) for @elements;
  return $self->SUPER::push(@elements);
}

sub unshift {
  my $self = shift;
  my @elements = @_;
  $_->owner($self->owner) for @elements;
  return $self->SUPER::unshift(@elements);
}



sub delete {
  my $self  = shift;
  my $index = shift;
  $self->{element} or $self->load() or return;
  if (defined($index)) {
    my $obj = $self->object_at_index($index) or return $self->record('Class::Persist::Error', "Cannot delete, element $index doesn't exist", 1);
    $obj->delete() or return;
    return $self->SUPER::delete($index);
  }
  else {
    if (my $element = $self->element) {
      foreach my $elem (@$element) {
        $elem->delete() or return;
        Class::Persist::Proxy->proxy( $elem );
      }
    }
  }
  1;
}


1;

# Local Variables:
# mode:CPerl
# cperl-indent-level: 2
# indent-tabs-mode: nil
# End: