Gtk2-Ex-FormFactory
view release on metacpan or search on metacpan
lib/Gtk2/Ex/FormFactory/Proxy.pm view on Meta::CPAN
package Gtk2::Ex::FormFactory::Proxy;
use strict;
use Carp;
my $NAME_CNT = 0;
sub get_context { shift->{context} }
sub get_name { shift->{name} }
sub get_aggregated_by { shift->{aggregated_by} }
sub get_set_prefix { shift->{set_prefix} }
sub get_get_prefix { shift->{get_prefix} }
sub get_attr_activity_href { shift->{attr_activity_href} }
sub get_attr_accessors_href { shift->{attr_accessors_href} }
sub get_attr_aggregate_href { shift->{attr_aggregate_href} }
sub get_accessor { shift->{accessor} }
sub get_changes_attr_filter { shift->{changes_attr_filter} }
sub get_buffered { 0 }
sub get_object_changed { shift->{object_changed} }
sub set_object_changed { shift->{object_changed} = $_[1] }
sub new {
my $class = shift;
my %par = @_;
my ($context, $object, $name, $set_prefix, $get_prefix) =
@par{'context','object','name','set_prefix','get_prefix'};
my ($attr_accessors_href, $attr_activity_href, $aggregated_by) =
@par{'attr_accessors_href','attr_activity_href','aggregated_by'};
my ($accessor, $changes_attr_filter) =
@par{'accessor','changes_attr_filter'};
$attr_accessors_href ||= {},
$attr_activity_href ||= {};
$name ||= "object_".$NAME_CNT++;
my $self = bless {
context => $context,
object => $object,
name => $name,
aggregated_by => $aggregated_by,
set_prefix => $set_prefix,
get_prefix => $get_prefix,
attr_activity_href => $attr_activity_href,
attr_accessors_href => $attr_accessors_href,
accessor => $accessor,
changes_attr_filter => $changes_attr_filter,
attr_aggregate_href => {},
}, $class;
return $self;
}
sub get_object {
my $self = shift;
my $object = $self->{object};
ref $object eq 'CODE' ? &$object() : $object;
}
sub update_by_aggregation {
my $self = shift;
my $aggregated_by = $self->get_aggregated_by;
my $object = $self->get_attr($aggregated_by);
$self->set_object($object);
1;
}
sub set_object {
my $self = shift;
my ($object) = @_;
#-- nothing to do if it's the same object
#-- (eval{} is for catching Class::DBI exceptions if
#-- $self->{object} was deleted in the meantime)
return if eval { $object eq $self->{object} };
#-- reset changed status
$self->set_object_changed(0);
#-- set object
$self->{object} = $object;
#-- Update all object widgets
my $context = $self->get_context;
$context->update_object_widgets ($self->get_name);
#-- Update aggregated objects
my $attr_aggregate_href = $self->get_attr_aggregate_href;
my ($attr, $child_object_name, $child_object);
while ( ($attr, $child_object_name) = each %{$attr_aggregate_href} ) {
$child_object = $self->get_attr($attr);
$context->set_object($child_object_name, $child_object);
}
return $object;
}
sub get_attr {
my $self = shift;
my ($attr_name) = @_;
if ( $attr_name =~ /^([^.]+)\.(.*)$/ ) {
$self = $self->get_context->get_proxy($1);
$attr_name = $2;
}
my $accessor = $self->get_accessor;
my $object = $self->get_object;
return &$accessor($object, $attr_name) if $accessor;
my $method = $self->get_get_prefix.$attr_name;
$accessor = $self->get_attr_accessors_href->{$method};
return if not $object;
( run in 0.881 second using v1.01-cache-2.11-cpan-39bf76dae61 )