sub new { # parameters: # [$this], # @attributes: tree, messageNum, messageText my ($this, @attributes) = @_; # "process" optional attributes my %attributes = ( tree => undef, messageNum => undef, messageText => undef, @attributes, ); # assert for valid argument list if ((keys %attributes) > 3) { die "invalid argument list during function call!\n"; } # assert mandatory parameters my $tree = $attributes{tree}; my $messageNum = $attributes{messageNum}; my $messageText = $attributes{messageText}; if ((!defined($this)) || (!defined($tree)) || (!defined($messageNum))) { die "invalid argument list during function call!\n"; } #### sub new { # parameters: # [$this], # @namedParameters: tree, messageNum, (messageText) ##### process parameters ##### my ($this, @namedParameters) = @_; # process named parameters (with default values) my ($tree, $messageNum, $messageText) = assertNamedParameters([ numNamedParameters => 3, tree => undef, messageNum => undef, messageText => undef, ], \@namedParameters ); # check mandatory paramters assertValueIsDefined($this, $tree, $messageNum); #### sub assertNamedParameters { # parameters: # $parametersRef, $argumentsRef my ($parametersRef, $argumentsRef) = @_; # check passed arguments assertValueIsDefined($parametersRef, $argumentsRef); # create parameter hash my %parameters = ( @{$parametersRef}, @{$argumentsRef}, ); # get valid number of parameters if (!exists($parameters{numNamedParameters})) { assertThrowException( "parameter key ('numNamedParameters') has not been defined in passed parameter hash"); } # get number of parameters my $numNamedParameters = $parameters{numNamedParameters}; # assert for valid parameter count if ($numNamedParameters < 1) { assertThrowException( "invalid number of parameters ($numNamedParameters) specified (minimum is one parameter)"); } # assert parameter list for valid parameter count # (account for the numParameters key itself (!)) if ((keys %parameters) != ($numNamedParameters + 1)) { assertThrowException( "invalid number of parameters ($numNamedParameters) passed"); } # return parameter values my ($parameterName, $parameterValue, @parameterValues); # retrieve each given parameter # (skipping 'numParameters' key) for (my $i = 1; $i <= $numNamedParameters; $i++) { # retrieve parameter name from parameter list # IN ORDER concerning given parameter list! $parameterName = $parametersRef->[2*$i]; # get parameter value from parameter hash $parameterValue = $parameters{$parameterName}; push(@parameterValues, $parameterValue); } return(@parameterValues); }