/usr/local/CPAN/Java-Import/Java/Import/ClassProxy.pm
use Java::Wrapper;
use Java::TieJavaArray;
package Java::Import::ClassProxy;
use overload q("") => sub {
$_[0]{prisoner}->toString();
};
sub _wrap_java_object {
#print "***_WRAP_JAVA_OBJECT***\n";
my $prisoner = shift;
my $self = {};
$$self{prisoner} = $prisoner;
bless $self, __PACKAGE__;
}
sub _get_argument_list {
my $arg_list = new Java::Wrapper::ArgumentArray(scalar(@_));
foreach my $arg ( @_ ) {
my $prisoner = $$arg{prisoner};
$arg_list->addElement($prisoner);
}
$arg_list->DISOWN();
$arg_list;
}
sub _wrap_return_value {
#print "***_WRAP_RETURN_VALUE***\n";
my $input = shift;
#XXX void return types from class compiled Java cause an error
if ( $input->isArray() ) {
#print "***IS ARRAY***\n";
my @tiedarray;
tie @tiedarray, "Java::Import::TieJavaArray", Java::Wrapper::ArrayWrapper::getObjectAsArray($input);
$ret_val = \@tiedarray;
} else {
#print "***IS NOT ARRAY***\n";
$ret_val = _wrap_java_object($input);
}
$ret_val;
}
sub _wrap_exception {
my $exception = shift;
#_wrap_java_object($exception);
_wrap_java_object($exception->invokeMethod("getTargetException", undef));
}
sub _exec_method {
my $method_name = shift;
my $self = shift;
my $ret_val = $$self{prisoner}->invokeMethod($method_name, _get_argument_list(@_));
my $exception_thrown = $$self{prisoner}->getLastThrownException();
die _wrap_exception($exception_thrown) if $exception_thrown;
_wrap_return_value($ret_val);
}
sub _exec_static_method {
my $method_name = shift;
(my $called = shift) =~ s/::/\./g;
print "$called ... $method_name\n";
my $ret_val = Java::Wrapper::ObjectWrapper::invokeStaticMethod(
$called, $method_name, _get_argument_list(@_)
);
my $exception_thrown = Java::Wrapper::ObjectWrapper::getLastStaticThrownException();
die _wrap_exception($exception_thrown) if $exception_thrown;
_wrap_return_value($ret_val);
}
sub new {
#print "***NEW***\n";
my $real_class = shift;
(my $java_class = $real_class) =~ s/::/\./g;
my $arg_list = _get_argument_list(@_);
my $ret_val = Java::Wrapper::ObjectWrapper::newClassInstance($java_class, $arg_list);
my $exception_thrown = Java::Wrapper::ObjectWrapper::getLastStaticThrownException();
die _wrap_exception( $exception ) if $exception_thrown;
return _wrap_return_value($ret_val);
}
sub isa {
my $self = shift;
(my $isa_class = shift) =~ s/::/\./g;
$$self{prisoner}->perl_isa($isa_class);
}
sub can {
my $self = shift;
$$self{prisoner}->can(shift);
}
sub AUTOLOAD {
#print "***AUTOLOAD***\n";
my $either = shift;
#print "\$either: $either\n";
#print "\$AUTOLOAD: $AUTOLOAD\n";
my $arg_list = _get_argument_list(@_);
my $ret_val = undef;
my $exception_thrown = undef;
unless ( ref $either ) {
#print "***STATIC METHOD\n***\n";
#Static Method being called
# my ($package_name) = ($AUTOLOAD =~/(.*)::\w+$/);
# my ($method_name) = ($AUTOLOAD =~/.*::(\w+)$/);
# print "\$package_name: $package_name\n";
# eval qq{
# package $package_name;
# sub $method_name { Java::Import::ClassProxy::_exec_static_method("$method_name", \@_); }
# };
#
# unshift @_, $either;
# goto &{$AUTOLOAD};
(my $called = $AUTOLOAD) =~ s/::/\./g;
$ret_val = Java::Wrapper::ObjectWrapper::invokeStaticMethod(
($called =~ /(.*)\.\w+$/),
($called =~ /.*\.(\w+)$/),
$arg_list
);
$exception_thrown = Java::Wrapper::ObjectWrapper::getLastStaticThrownException();
} else {
#print "***OBJECT METHOD***\n";
#Object Method being called
# my ($package_name) = ($AUTOLOAD =~/(.*)::\w+$/);
# my ($method_name) = ($AUTOLOAD =~/.*::(\w+)$/);
# eval qq{
# package $package_name;
# sub $method_name { _exec_method("$method_name", \@_); }
# };
#
# unshift @_, $either;
# goto &{$AUTOLOAD};
$ret_val = $$either{prisoner}->invokeMethod(($AUTOLOAD =~/.*::(\w+)$/), $arg_list);
$exception_thrown = $$either{prisoner}->getLastThrownException();
}
#HOW DO I HANDLE FIELDS?????
die _wrap_exception($exception_thrown) if $exception_thrown;
_wrap_return_value($ret_val);
}
sub DESTROY {}
1;