A few correction/additions:

- Of course for Perl you do not need to call Inline. Just have the
sub{} do whatever it takes to load your code.

- Calc::Calc in Calc.cpp should be more like this:

    Calc::Calc(){
    }


Thanks,

Patrick


 25 Jan 2005 15:37:26 -0500, Patrick LeBoutillier
<[EMAIL PROTECTED]> wrote:
> Hi all,
> 
> I have a Perl client for a project I'm working on these days. The API
> for the client is really simple (1 class with new(), connect(),
> read(), print() and close() methods). Naturally I have
> a Perl test suite written using the standard (Test.pm in my case) tools.
> 
> Once my project was pretty much working, I realized I would need a
> Java client, so I wrote one, using the same exact API.
> 
> It was then that I realized that, with a few lines of Perl code and
> Inline::Java, I could use the Perl test suite I wrote for the Perl
> client to test the Java Client.
> 
> I then realized that I could push it further and started writing a new
> module, Inline::Select. It works like this:
> 
> Suppose you have the following code, all in different languages:
> 
> Calc.cpp:
> class Calc {
>         public:
>                 Calc() ;
>                 int add(int a, int b) ;
> } ;
> Calc::Calc(){
>         lang = strdup("CPP") ;
> }
> int Calc::add(int a, int b){
>         return a + b ;
> }
> 
> Calc.java:
> class Calc {
>         public Calc(){
>         }
>         public int add(int a, int b){
>                 return a + b ;
>         }
> }
> 
> Calc.pm:
> package Calc ;
> sub new {
>         my $class = shift ;
>         bless({}, $class) ;
> }
> sub add {
>         my $this = shift ;
>         my $a = shift ;
>         my $b = shift ;
>         return $a + $b ;
> }
> 1 ;
> 
> Calc.py:
> class Calc:
>    def __init__(self) :
>        pass
> 
>    def add(self,a,b) :
>        return a + b
> 
> You could then write a test script like this:
> 
> use strict ;
> use warnings ;
> use Test ;
> 
> BEGIN {plan(tests => 1) ;}
> 
> use Inline::Select (
>         PACKAGE => 'Calc',
>         Inline => [ Perl => sub {require 't/Calc.pm'} ]
> ) ;
> use Inline::Select (
>         PACKAGE => 'Calc',
>         Inline => [ CPP => 't/Calc.cpp' ]
> ) ;
> use Inline::Select (
>         PACKAGE => 'Calc',
>         Inline => [ Java => 't/Calc.java' ]
> ) ;
> use Inline::Select (
>         PACKAGE => 'Calc',
>         Inline => [ Python => 't/Calc.py' ]
> ) ;
> 
> use Inline::Select (
>         PACKAGE => 'Calc',
>         Inline => $ARGV[0]
> ) ;
> 
> my $c = new Calc() ;
> ok($c->add(2, 3), 5) ;
> 
> And then say:
> 
> $ test.pl (Perl|Java|CPP|Python)
> 
> The 'Calc' namespace will then be "filled in" by the approriate Inline
> language block and the script will automatically pick up the right
> implementation.
> 
> The way it works is easy: Each time you "use Inline::Select" with an
> array ref as the Inline parameter, the block is saved for later use.
> When the Inline parameter is a scalar, that language is selected and
> the appropriate Inline block is compiled in the caller package. The
> PACKAGE parameter is used to identify which blocks go together.
> 
> I'm still not sure the API is optimal but, hey, its still version 0.01...
> 
> Anyone have any comments/suggestions/anything?
> 
> Cheers,
> 
> Patrick
> 
> --
> =====================
> Patrick LeBoutllier
> Laval, Québec, Canada
> 


-- 
=====================
Patrick LeBoutllier
Laval, Québec, Canada

Reply via email to