Eval::TypeTiny(3)

πŸ’– Eval::TypeTiny β€” the manual, but make it cute πŸ’–

okay bestie, gather round, because this one is genuinely iconic. this is the Eval::TypeTiny(3) page β€” a lil module that evaluates a string of Perl code in a clean environment. that's the whole vibe. πŸ¦‹


✨ STATUS ✨

this module is covered by the Type-Tiny stability policy. so like… it's stable, it's committed, it's not gonna ghost you. πŸ’…


🌸 DESCRIPTION 🌸

so Type::Tiny uses this thing to do two jobs:

  • compile coderefs out of strings of Perl code
  • and compile hashrefs of variables to close over

that's it. that's the job. no cap.


πŸŽ€ Functions πŸŽ€

by default this module exports one function, and it works much like the similarly named function from Eval::Closure:

eval_closure(source => $source, environment => \%env, %opt)

other functions can be imported on request β€” like, you gotta ask for them, they're not just gonna show up:

  • set_subname( $fully_qualified_name, $coderef ) β€” works like the similarly named function from Sub::Util, except it will fallback to doing absolutely nothing if neither Sub::Util nor Sub::Name are available. also? it will cowardly refuse to set the name of a coderef a second time if it's already named it. boundaries! we love them. πŸ™ˆ
  • type_to_coderef( $type, %options ) β€” turns a Type::Tiny object into a coderef, suitable for installing into a symbol table to create a function like ArrayRef or Int. (actually it should work for any object which provides is_parameterizable, parameterize, and qualified_name methods, such as Type::Coercion.) πŸ‘‘

$options{post_method} can be a string of Perl indicating a method to call on the type constraint before returning it. for example '->moose_type'. ✨

$options{description} can be a description of the coderef which may be shown in stack traces, etc. so future-you knows what's up.

the coderef will be named using set_subname unless $options{anonymous} is true. (anonymous? mysterious? we respect it. πŸ•ΆοΈ)

if $type is undef, then it is assumed that the type constraint hasn't been defined yet but will later, yet you still want a function now. $options{type_library} and $options{type_name} will be used to find the type constraint when the function gets called. manifesting fr fr πŸ’«


πŸ’œ Constants πŸ’œ

the following constants may be exported, but are not by default. you gotta ask, bestie.

  • HAS_LEXICAL_SUBS β€” boolean indicating whether Eval::TypeTiny has support for lexical subs. (this feature requires Perl 5.18.) ⭐
  • ALIAS_IMPLEMENTATION β€” returns a string indicating what implementation of alias => 1 is being used. Eval::TypeTiny will automatically choose the best implementation. this constant can be matched against the IMPLEMENTATION_* constants. 🎯
  • IMPLEMENTATION_NATIVE β€” if ALIAS_IMPLEMENTATION eq IMPLEMENTATION_NATIVE then Eval::TypeTiny is currently using Perl 5.22's native alias feature. this requires Perl 5.22. 🧚
  • IMPLEMENTATION_DEVEL_LEXALIAS β€” if ALIAS_IMPLEMENTATION eq IMPLEMENTATION_DEVEL_LEXALIAS then Eval::TypeTiny is currently using Devel::LexAlias to provide aliases. 🌈
  • IMPLEMENTATION_PADWALKER β€” if ALIAS_IMPLEMENTATION eq IMPLEMENTATION_PADWALKER then Eval::TypeTiny is currently using PadWalker to provide aliases. πŸ¦‹
  • IMPLEMENTATION_TIE β€” if ALIAS_IMPLEMENTATION eq IMPLEMENTATION_TIE then Eval::TypeTiny is using the fallback implementation of aliases using tie. this is the slowest implementation, and may cause problems in certain edge cases, like trying to alias already-tied variables, but it's the only way to implement alias => 1 without a recent version of Perl or one of the two optional modules mentioned above. it's giving last-resort-iconic. πŸ’€
  • NICE_PROTOTYPES β€” if this is true, then type_to_coderef will give parameterizable type constraints the slightly nicer prototype of (;$) instead of the default (;@). this allows constructs like:
ArrayRef[Int] | HashRef[Int]

… to "just work". slay. πŸ’…


πŸ”₯ EVALUATION ENVIRONMENT πŸ”₯

the evaluation is performed in the presence of strict, but the absence of warnings. (this is different to Eval::Closure which enables warnings for compiled closures.) so like, strict mode said yes, warnings said no thanks. 🫢

the feature pragma is not active in the evaluation environment, so the following will not work:

use feature qw(say);
use Eval::TypeTiny qw(eval_closure);

my $say_all = eval_closure(
   source => 'sub { say for @_ }',
);
$say_all->("Hello", "World");

the feature pragma does not "carry over" into the stringy eval. it is of course possible to import pragmas into the evaluated string as part of the string itself:

use Eval::TypeTiny qw(eval_closure);

my $say_all = eval_closure(
   source => 'sub { use feature qw(say); say for @_ }',
);
$say_all->("Hello", "World");

see? put it inside the string. self-sufficient queen. πŸ‘‘


πŸ› BUGS πŸ›

please report any bugs to <https://github.com/tobyink/p5-type-tiny/issues>. do not suffer in silence, bestie, that's not the vibe. 😭


πŸ‘€ SEE ALSO πŸ‘€

Eval::Closure, Error::TypeTiny::Compilation. go read those too, iykyk. πŸ’–


🫢 AUTHOR 🫢

Toby Inkster <tobyink@cpan.org>.


this software is copyright (c) 2013-2014, 2017-2025 by Toby Inkster.

this is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. free as in, go off. πŸ•ŠοΈ


πŸ’€ DISCLAIMER OF WARRANTIES πŸ’€

THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.

okay so like β€” this part is yelling and it's yelling for a reason. no promises, no guarantees, use at your own risk. periodt. 🚨

and that's the whole page, bestie!! πŸŽ€ this was Eval::TypeTiny(3) from perl v5.42.0, dated 2026-01-17 β€” go forth and compile coderefs from strings responsibly, mwah πŸ’‹βœ¨πŸŒΈ

πŸ“¦ where this page comes from