http://www.perlmonks.org?node_id=1183630


in reply to Re^2: Accessing an XS function from a Perl function of the same name
in thread Accessing an XS function from a Perl function of the same name

If you want to wrap a library function (let's call it 'foo') in an XS sub, and be able to call that XS sub from perl as 'foo', then you make use of the XS PREFIX option - which allows you to specify a prefix that will be automatically stripped from the XS sub when it is bound to perl.

For example, specify PREFIX as 'wrap_this_', write the XS Sub as:
int wrap_this_foo(int x) { return foo(x); }
Then, when you call foo(16) in perl, wrap_this_foo(16) is executed.

Here's an Inline::C demo that gets a perl function named 'foo' to execute a C function named 'foo', via an XS sub named 'wrap_this_foo' that wraps the C sub 'foo'.
use strict; use warnings; use Inline C => Config => PREFIX => 'wrap_this_', BUILD_NOISY => 1, ; use Inline C => <<'END_C'; typedef int unbind; /* For this demo, we don't want foo * to bind to perl */ unbind foo(int x) { return x * 2; } int wrap_this_foo(int x){ return foo(x); } END_C print foo(16); # Outputs 32
If you comment out the the wrap_this_foo XS sub and re-run the script then you get:
Undefined subroutine &main::foo called at try.pl line 25.
I hope that proves that the original run was, in fact, calling wrap_this_foo and not directly calling the C function foo (which is invisible to perl).
Update: It's invisible to perl because perl's typemap doesn't explain how to deal with the type 'unbind'.

Cheers,
Rob