NAME
slot - global reactive state slots with optional watchers
SYNOPSIS
# Define and use slots
package Config;
use slot qw(app_name debug);
app_name("MyApp");
debug(1);
# Access from another package (same underlying storage)
package Service;
use slot qw(app_name);
print app_name(); # "MyApp"
app_name("Changed");
# Watchers (reactive)
slot::watch('app_name', sub {
my ($name, $value) = @_;
print "app_name changed to: $value\n";
});
slot::unwatch('app_name'); # Remove all watchers
DESCRIPTION
slot provides fast, globally-shared named storage slots with XS performance. Slots are shared across all packages - importing the same slot name in different packages gives access to the same underlying value.
Key features:
Fast - Custom ops, faster than raw hash access (~100M setter, ~65M getter)
Global - Slots are shared across packages by name
Reactive - Optional watchers fire on value changes
Lazy watchers - No overhead unless you use
watch()
FUNCTIONS
import
use slot qw(foo bar baz);
Imports slot accessors into the calling package. Each accessor is both a getter and setter:
foo(); # get
foo(42); # set and returns value
slot::get
my $val = slot::get('name');
Get a slot value by name (without importing an accessor).
slot::set
slot::set('name', $value);
Set a slot value by name.
slot::watch
slot::watch('name', sub { my ($name, $val) = @_; ... });
Register a callback that fires whenever the slot value changes.
slot::unwatch
slot::unwatch('name'); # Remove all watchers
slot::unwatch('name', $coderef); # Remove specific watcher
slot::slots
my @names = slot::slots();
Returns a list of all defined slot names.
BENCHMARK
bench.pl is included
=== SETTER BENCHMARK ===
Rate pp_closure pp_hash raw_hash slot
pp_closure 12277720/s -- -14% -82% -96%
pp_hash 14298759/s 16% -- -80% -96%
raw_hash 70063941/s 471% 390% -- -79%
slot 340183182/s 2671% 2279% 386% --
=== GETTER BENCHMARK ===
Rate pp_closure pp_hash raw_hash slot
pp_closure 11513773/s -- -14% -79% -84%
pp_hash 13345509/s 16% -- -76% -82%
raw_hash 54947210/s 377% 312% -- -25%
slot 72793704/s 532% 445% 32% --
AUTHOR
LNATION <email@lnation.org>
LICENSE
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.