FFI::Platypus::Closure#
Platypus closure object
VERSION#
version 2.12
SYNOPSIS#
create closure with OO interface
use FFI::Platypus::Closure;
my $closure = FFI::Platypus::Closure->new(sub { print "hello world\n" });
create closure from Platypus object
use FFI::Platypus 2.00;
my $ffi = FFI::Platypus->new( api => 2 );
my $closure = $ffi->closure(sub { print "hello world\n" });
use closure
$ffi->function(foo => ['()->void'] => 'void')->call($closure);
DESCRIPTION#
This class represents a Perl code reference that can be called from compiled code. When you create a closure object, you can pass it into any function that expects a function pointer. Care needs to be taken with closures because compiled languages typically have a different way of handling lifetimes of objects. You have to make sure that if the compiled code is going to call a closure that the closure object is still in scope somewhere, or has been made sticky, otherwise you may get a segment violation or other mysterious crash.
CONSTRUCTOR#
new#
my $closure = FFI::Platypus::Closure->new($coderef);
Create a new closure object; $coderef must be a subroutine code reference.
METHODS#
call#
$closure->call(@arguments);
$closure->(@arguments);
Call the closure from Perl space. May also be invoked by treating the closure object as a code reference.
sticky#
$closure->sticky;
Mark the closure sticky, meaning that it won’t be free’d even if all the reference of the object fall out of scope.
[version 2.12]
Returns $self, so this method may be chained.
unstick#
$closure->unstick;
Unmark the closure as sticky.
[version 2.12]
Returns $self, so this method may be chained.
COPYRIGHT AND LICENSE#
This software is copyright (c) 2015-2022 by Graham Ollis.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.