package GTx::APE::Process;

use strict;
use warnings;
use Carp;

use constant TRUE  => 1;
use constant FALSE => 0;


{
    my %_attributes = (
		       description    => undef,
		       processId      => undef,
		       code           => undef,
		       underProcess   => undef,
		       executeOrder   => undef,
		       remark         => undef,
		       processTypeId  => undef,
		       subProcessList => [],
		       );

    my %object; 


    ## Autoloader wanna be. Inserts the sub calls that I want to be
    ## accessible into the symbol table.
    foreach my $attName (keys(%_attributes)) {
	no strict 'refs';
	*{__PACKAGE__ . "::get\u$attName"} = sub { $object{ $_[0] }->{$attName} }
    }


    #################################################################
    ## Constructor method for this object. Returns a new
    ## Process object.
    #################################################################
    sub new {
	no strict 'refs';
	my ($proto,%args) = @_;
	
	my $class = ref($proto) || $proto;
	my $self = bless {}, $class;
	
	%args = $self->_init(%args);

	my @leftover = keys %args;

	confess "Error: @leftover" if @leftover;

	return $self;
    }


    #################################################################
    ## Initialise the objects private attributes. The argument is
    ## deleted as it is found, initialised and set.
    #################################################################
    sub _init {
	my ($self,%args) = @_;

	foreach my $attName (keys(%args)) {
	    if(exists($_attributes{$attName})) { 
		$object{ $self }->{$attName} = delete $args{$attName};
	    }
	}

	return %args;
    }

    
    #################################################################
    ## Method to add Process objects to this object to reflect a
    ## hierachy.
    #################################################################
    sub newSubProcess {
	my ($self,$newSubProcess) = @_;
	
	push( @{$object{ $self }->{subProcessList}}, $newSubProcess );
    }

    
    #################################################################
    ## Method to return the number of sub processes this process has.
    #################################################################
    sub getSubProcessCount {
	my $self = shift;
	return scalar(@{$object{ $self }->{subProcessList}});
    }

    
    #################################################################
    ## Method to reset the process list.
    #################################################################    
    sub resetProcessList {
        my $self = shift;
        $object{ $self }->{subProcessList} = [];
    }

    
    #################################################################
    ## Method to destroy this object.    
    #################################################################
    sub DESTROY {
	my $self = shift;
	delete $object{$self};
    }
}

1;
