Evented-Object
view release on metacpan or search on metacpan
lib/Evented/Object/Hax.pm view on Meta::CPAN
# Copyright (c) 2011-16, Mitchell Cooper
#
# Evented::Object: a simple yet featureful base class event framework.
# https://github.com/cooper/evented-object
#
package Evented::Object::Hax;
use warnings;
use strict;
use 5.010;
use List::Util qw(first);
our $VERSION = '5.68';
# exported import subroutine.
sub import {
my ($export_pkg, $import_pkg, @import) = (shift, (caller)[0], @_);
# import each item.
foreach my $item (@import) {
my $code = $export_pkg->can($item) or next;
export_code($import_pkg, $item, $code);
}
}
# fetch a symbol from package's symbol table.
sub get_symbol {
my ($package, $variable, $ref) = @_;
# must start with a sigil.
return if $variable !~ m/^([@\*%\$])(\w+)$/;
my ($sigil, $var_name) = ($1, $2);
my $symbol = $package.q(::).$var_name;
no strict 'refs';
# find the symbol.
if ($sigil eq '$') { return $ref ? \$$symbol : $$symbol }
if ($sigil eq '@') { return $ref ? \@$symbol : @$symbol }
if ($sigil eq '*') { return $ref ? \*$symbol : *$symbol }
if ($sigil eq '%') { return $ref ? \&$symbol : %$symbol }
return;
}
# fetch a reference to a symbol.
sub get_symbol_ref { get_symbol(@_, 1) }
# set a symbol in package's symbol table.
sub set_symbol {
my ($package, $variable, @values) = @_;
# several symbols.
if (ref $variable && ref $variable eq 'HASH') {
set_symbol($package, $_, $variable->{$_}) foreach keys %$variable;
return;
}
# must start with a sigil.
return if $variable !~ m/^([@\*%\$])(\w+)$/;
my ($sigil, $var_name) = ($1, $2);
my $symbol = $package.q(::).$var_name;
no strict 'refs';
# find the symbol.
if ($sigil eq '$') { $$symbol = $values[0] }
if ($sigil eq '@') { @$symbol = @values }
if ($sigil eq '*') { *$symbol = $values[0] }
if ($sigil eq '%') { %$symbol = @values }
return;
}
# export a subroutine.
# export_code('My::Package', 'my_sub', \&_my_sub)
( run in 0.918 second using v1.01-cache-2.11-cpan-5511b514fd6 )