Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
Eval::Closure(3)      User Contributed Perl Documentation     Eval::Closure(3)

NAME
       Eval::Closure - safely and cleanly create closures via string eval

VERSION
       version 0.14

SYNOPSIS
	 use Eval::Closure;

	 my $code = eval_closure(
	     source	 => 'sub { $foo++ }',
	     environment => {
		 '$foo'	=> \1,
	     },
	 );

	 warn $code->(); # 1
	 warn $code->(); # 2

	 my $code2 = eval_closure(
	     source => 'sub { $code->()	}',
	 ); # dies, $code isn't	in scope

DESCRIPTION
       String eval is often used for dynamic code generation. For instance,
       "Moose" uses it heavily,	to generate inlined versions of	accessors and
       constructors, which speeds code up at runtime by	a significant amount.
       String eval is not without its issues however - it's difficult to
       control the scope it's used in (which determines	which variables	are in
       scope inside the	eval), and it's	easy to	miss compilation errors, since
       eval catches them and sticks them in $@ instead.

       This module attempts to solve these problems. It	provides an
       "eval_closure" function,	which evals a string in	a clean	environment,
       other than a fixed list of specified variables. Compilation errors are
       rethrown	automatically.

FUNCTIONS
   eval_closure(%args)
       This function provides the main functionality of	this module. It	is
       exported	by default. It takes a hash of parameters, with	these keys
       being valid:

       source
	   The string to be evaled. It should end by returning a code
	   reference. It can access any	variable declared in the "environment"
	   parameter (and only those variables). It can	be either a string, or
	   an arrayref of lines	(which will be joined with newlines to produce
	   the string).

       environment
	   The environment to provide to the eval. This	should be a hashref,
	   mapping variable names (including sigils) to	references of the
	   appropriate type. For instance, a valid value for environment would
	   be "{ '@foo'	=> [] }" (which	would allow the	generated function to
	   use an array	named @foo). Generally,	this is	used to	allow the
	   generated function to access	externally defined variables (so you
	   would pass in a reference to	a variable that	already	exists).

	   In perl 5.18	and greater, the environment hash can contain
	   variables with a sigil of "&". This will create a lexical sub in
	   the evaluated code (see "The	'lexical_subs' feature"	in feature).
	   Using a "&" sigil on	perl versions before lexical subs were
	   available will throw	an error.

       alias
	   If set to true, the coderef returned	closes over the	variables
	   referenced in the environment hashref. (This	feature	requires
	   Devel::LexAlias.) If	set to false, the coderef closes over a
	   shallow copy	of the variables.

	   If this argument is omitted,	Eval::Closure will currently assume
	   false, but this assumption may change in a future version.

       description
	   This	lets you provide a bit more information	in backtraces.
	   Normally, when a function that was generated	through	string eval is
	   called, that	stack frame will show up as "(eval n)",	where 'n' is a
	   sequential identifier for every string eval that has	happened so
	   far in the program. Passing a "description" parameter lets you
	   override that to something more useful (for instance, Moose
	   overrides the description for accessors to something	like "accessor
	   foo at MyClass.pm, line 123").

       line
	   This	lets you override the particular line number that appears in
	   backtraces, much like the "description" option. The default is 1.

       terse_error
	   Normally, this function appends the source code that	failed to
	   compile, and	prepends some explanatory text.	Setting	this option to
	   true	suppresses that	behavior so you	get only the compilation error
	   that	Perl actually reported.

BUGS
       No known	bugs.

       Please report any bugs to GitHub	Issues at
       <https://github.com/doy/eval-closure/issues>.

SEE ALSO
       o   Class::MOP::Method::Accessor

	   This	module is a factoring out of code that used to live here

SUPPORT
       You can find this documentation for this	module with the	perldoc
       command.

	   perldoc Eval::Closure

       You can also look for information at:

       o   MetaCPAN

	   <https://metacpan.org/release/Eval-Closure>

       o   Github

	   <https://github.com/doy/eval-closure>

       o   RT: CPAN's request tracker

	   <http://rt.cpan.org/NoAuth/Bugs.html?Dist=Eval-Closure>

       o   CPAN	Ratings

	   <http://cpanratings.perl.org/d/Eval-Closure>

NOTES
       Based on	code from Class::MOP::Method::Accessor,	by Stevan Little and
       the Moose Cabal.

AUTHOR
       Jesse Luehrs <doy@tozt.net>

COPYRIGHT AND LICENSE
       This software is	copyright (c) 2016 by Jesse Luehrs.

       This is free software; you can redistribute it and/or modify it under
       the same	terms as the Perl 5 programming	language system	itself.

perl v5.24.1			  2016-05-29		      Eval::Closure(3)

NAME | VERSION | SYNOPSIS | DESCRIPTION | FUNCTIONS | BUGS | SEE ALSO | SUPPORT | NOTES | AUTHOR | COPYRIGHT AND LICENSE

Want to link to this manual page? Use this URL:
<https://www.freebsd.org/cgi/man.cgi?query=Eval::Closure&sektion=3&manpath=FreeBSD+12.0-RELEASE+and+Ports>

home | help