sub
new {
my
$class
=
shift
;
my
$self
= {
required_parameters_count
=> 1
};
return
bless
$self
,
$class
;
}
sub
process {
my
(
$self
,
$command
) =
@_
;
try
{
my
$payload_ref
=
$command
->{payload};
my
@payload
=
@$payload_ref
;
my
$parameters_length
=
scalar
@payload
;
if
(
$parameters_length
<
$self
->{required_parameters_count}) {
die
Exception->new(
"InvokeGlobalFunctionHandler parameters mismatch: requires at least one parameter (fully qualified method name)"
);
}
my
$fully_qualified_method
=
$payload
[0];
unless
(
$fully_qualified_method
=~ /^(.*)::([^:]+)$/) {
die
Exception->new(
"Invalid fully qualified method name: $fully_qualified_method"
);
}
my
(
$package
,
$function_name
) =
$fully_qualified_method
=~ /^(.*)::([^:]+)$/;
eval
"require $package"
;
if
($@) {
die
Exception->new(
"Failed to load package '$package': $@"
);
}
my
$code_ref
=
$package
->can(
$function_name
);
unless
(
$code_ref
) {
die
Exception->new(
"Method '$function_name' not found in package '$package'"
);
}
my
@args
=
@payload
[1 ..
$#payload
];
return
$code_ref
->(
@args
);
}
catch
(
$e
) {
return
Exception->new(
$e
);
}
}
1;