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 )