FFI-C
view release on metacpan or search on metacpan
lib/FFI/C.pm view on Meta::CPAN
package FFI::C;
use strict;
use warnings;
use 5.008001;
use Carp ();
use Ref::Util qw( is_ref is_plain_arrayref is_plain_hashref );
# ABSTRACT: C data types for FFI
our $VERSION = '0.15'; # VERSION
our %ffi;
sub _ffi_get
{
my($filename) = @_;
$ffi{$filename} ||= do {
require FFI::Platypus;
FFI::Platypus->new( api => 1 );
};
}
sub ffi
{
my($class, $new) = @_;
my(undef, $filename) = caller;
if($new)
{
Carp::croak("Already have an FFI::Platypus instance for $filename")
if defined $ffi{$filename};
return $ffi{$filename} = $new;
}
_ffi_get($filename);
}
our $def_class;
sub _gen
{
shift;
my($class, $filename) = caller;
my($name, $members);
my %extra = is_plain_hashref $_[-1] ? %{ pop() } : ();
if(@_ == 2 && !is_ref $_[0] && is_plain_arrayref $_[1])
{
($name, $members) = @_;
}
elsif(@_ == 1 && is_plain_arrayref $_[0])
{
$name = lcfirst [split /::/, $class]->[-1];
$name =~ s/([A-Z]+)/'_' . lc($1)/ge;
$name .= "_t";
($members) = @_;
}
else
{
my($method) = map { lc $_ } $def_class =~ /::([A-Za-z]+)Def$/;
Carp::croak("usage: FFI::C->$method([\$name], \\\@members)");
}
$def_class->new(
( run in 2.754 seconds using v1.01-cache-2.11-cpan-6aa56a78535 )