NAME
Tie::Symbol - Tied interface to the symbol table
VERSION
version 0.001
SYNOPSIS
sub abc { 123 };
my $ST = Tie::Symbol->new;
my $abc = $ST->{'&abc'};
$abc->(); # returns 123
$ST->{'&abc'} = sub { 456 };
abc(); # returns 456
tie(my %ST, 'Tie::Symbol');
$ST{'&abc'}; # see above
DESCRIPTION
The tied hash represents the internal symbol table which allows the user to examine and modify the whole symbol table.
Currently this implementation limits the referents to scalars, arrays, hashes and subroutines.
Tied hash
tie my %hash, 'Tie::Symbol', $package;
The hash is tied to a specific namespace or the main package if no package is given.
Examine
our $PKG::scalar = 123;
tie my %ST, 'Tie::Symbol', 'PKG';
my $ScalarRef = $ST{'$scalar'};
package X::Y {
sub z { ... }
}
my $ST = Tie::Symbol->new;
my $z = $ST->{X}->{Y}->{'&z'};
my $z = $ST->{'X::Y'}->{'&z'};
my $z = $ST->{'&X::Y::z'};
METHODS
namespace
Returns the current namespace
$ST->namespace;
Thats in short just whats given as package name to "new"
parent_namespace
Return the name of the parent namespace.
my $parent_ns = $ST->parent_namespace;
Returns undef
if there is no parent namespace
parent
Like "parent_namespace" but return an instance of Tie::Symbol.
my $parent = $ST->parent;
my $parent_ns = $parent->namespace;
Returns undef
if there is no parent namespace
search
Search for a symbol with a regular expression
my @zzz = $ST->search(qr{zzz});
scalars
Returns a list of all scalars
my @scalars = $ST->scalars;
hashes
Returns a list of all hashes
my @hashes = $ST->hashes;
arrays
Returns a list of all arrays
my @arrays = $ST->arrays;
subs
Returns a list of all subroutines
my @subs = $ST->subs;
classes
Returns a list of all subclasses in namespace
my @classes = $ST->classes;
tree
Returns a recursive HashRef with all subclasses of a namespace
my $tree = $ST->tree;
new
Returns a blessed reference to a tied hash of ourselves.
my $ST = Tie::Symbol->new;
mine
Return the symbol table of the caller's scope.
my $my_symbol_table = Tie::Symbol->mine;
Dumping
tie my %ST, 'Tie::Symbol', 'PKG';
my @symbols = keys %ST;
Existence
exists $ST{'&code'} ? 'code exists' : 'code dont exists'
Caveat: existence checks on scalars and namespaces always returns true.
Modify
$ST{'&code'} = sub { ... };
$ST{'$scalar'} = \"...";
$ST{'@array'} = [ ... ];
$ST{'%hash'} = { ... };
Erasing
sub PKG::abc { ... }
tie my %ST, 'Tie::Symbol', 'PKG';
PKG::abc(); # works
my $abc = delete $ST{'&abc'};
PKG::abc(); # croaks
$abc->(); # subroutine survived anonymously!
Clearing
tie my %ST, 'Tie::Symbol', 'PKG';
%ST = ();
BUGS
Please report any bugs or feature requests on the bugtracker website https://github.com/zurborg/libtie-symbol-perl/issues
When submitting a bug or request, please include a test-file or a patch to an existing test-file that illustrates the bug or desired feature.
AUTHOR
David Zurborg <zurborg@cpan.org>
COPYRIGHT AND LICENSE
This software is Copyright (c) 2015 by David Zurborg.
This is free software, licensed under:
The ISC License