File Coverage

blib/lib/FFI/Platypus/Type/PtrObject.pm
Criterion Covered Total %
statement 27 27 100.0
branch 10 10 100.0
condition 4 5 80.0
subroutine 9 9 100.0
pod 0 1 0.0
total 50 52 96.1


line stmt bran cond sub pod time code
1             package FFI::Platypus::Type::PtrObject;
2              
3 1     1   270470 use strict;
  1         11  
  1         34  
4 1     1   6 use warnings;
  1         1  
  1         35  
5 1     1   6 use FFI::Platypus 1.11;
  1         27  
  1         27  
6 1     1   539 use Ref::Util qw( is_blessed_hashref );
  1         1901  
  1         95  
7 1     1   11 use Carp ();
  1         2  
  1         16  
8 1     1   18 use 5.008001;
  1         4  
9              
10             # ABSTRACT: Platypus custom type for an object wrapped around an opaque pointer
11             our $VERSION = '0.03'; # VERSION
12              
13              
14             push @FFI::Platypus::CARP_NOT, __PACKAGE__;
15              
16             sub ffi_custom_type_api_1
17             {
18 3     3 0 9900 my(undef, undef, $wrapper_class, $constructor) = @_;
19              
20 3 100       228 Carp::croak("no class specified") unless defined $wrapper_class;
21 2 100       218 Carp::croak("illegal class name: $wrapper_class") unless $wrapper_class =~ /^[A-Z_][0-9A-Z_]*(::[A-Z_][0-9A-Z_]*)*$/i;
22              
23             $constructor ||= sub {
24 2 100   2   13 defined $_[0] ? bless { ptr => $_[0] }, $wrapper_class : undef;
25 1   50     12 };
26              
27             return {
28             native_type => 'opaque',
29             perl_to_native => sub {
30 8 100 100 8   6014 Carp::croak("argument is not a $wrapper_class") unless is_blessed_hashref($_[0]) && $_[0]->isa($wrapper_class);
31 6         16 my $ptr = $_[0]->{ptr};
32 6 100       172 Carp::croak("pointer for $wrapper_class went away") unless defined $ptr;
33 5         41 $ptr;
34             },
35 1         10 native_to_perl => $constructor,
36             };
37             }
38              
39             1;
40              
41             __END__