Var-Extract
view release on metacpan or search on metacpan
lib/Var/Extract.pm view on Meta::CPAN
package Var::Extract;
use strict;
use warnings;
use PadWalker qw(var_name);
use base qw(Exporter);
our @EXPORT_OK = qw(vars_from_hash vars_from_getters);
our $VERSION = "0.02";
sub vars_from_hash {
my $h = shift;
for my $i (0..$#_) {
my $key = var_name(1, \$_[$i]);
ord($key) == ord('$') or die __PACKAGE__.": must be scalar!";
$key = substr($key,1);
$_[$i] = $h->{$key};
}
}
sub vars_from_getters {
my $prefix = shift;
my $obj;
if (ref $prefix) {
$obj = $prefix;
$prefix = "";
} else {
$obj = shift;
}
for my $i (0..$#_) {
my $key = var_name(1, \$_[$i]);
ord($key) == ord('$') or die __PACKAGE__.": must be scalar!";
$key = $prefix . substr($key,1);
$_[$i] = $obj->$key if ($obj->can($key))
}
}
1;
__END__
=head1 NAME
Var::Extract - Assign lexical scalar values from container types
=head1 SYNOPSIS
use Var::Extract qw(vars_from_hash vars_from_getters);
use Class::Struct qw(struct);
my $h = {
foo => "This is foo",
bar => "This is bar",
baz => "This is baz",
};
vars_from_hash($h, my ($foo,$bar,$baz));
print "foo:$foo\nbar:$bar\nbaz:$baz\n";
# => "foo: This is foo..."
struct Klass => [attr0 => '$', attr1 => '$'];
my $klass = Klass->new(attr0 => 42, attr1 => '666');
vars_from_getters($klass, my ($everything, $evil));
print "Everything is $everything, evil is $evil\n";
( run in 2.472 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )