Class-Observable
view release on metacpan or search on metacpan
2.001 Sun 07 Aug 2021
- No functional changes
- Updated package metadata
2.000 Sat 06 Feb 2021
- No changes from 1.90-TRIAL
1.90 Fri 05 Feb 2021
- Maintainer change and tooling update
- Fix to prevent delete_observer() from breaking observer references
- No more weakening of observer refs
- Proper inside-out implementation, including DESTROY and a CLONE for thread safety
(please note the documentation section on DESTROY)
- No more debug code (but debug-related functions and methods kept for backcompat)
1.04 Sat 16 Oct 2004
- Weakening of observer refs to prevent leaks (Scalar::Util required)
- New observer_log() and observer_error() to override logging/error output
1.03 Wed 16 Jun 2004
- POD typo fix. Thanks to Dan Langille
lib/Class/Observable.pm view on Meta::CPAN
if ( $^O eq 'Win32' or $Config::Config{'useithreads'} ) {
*NEEDS_REGISTRY = sub () { 1 };
*CLONE = sub {
my $have_warned;
foreach my $oldaddr ( keys %registry ) {
my $invocant = delete $registry{ $oldaddr };
my $observers = delete $O{ $oldaddr };
if ( defined $invocant ) {
my $addr = refaddr $invocant;
$O{ $addr } = $observers;
Scalar::Util::weaken( $registry{ $addr } = $invocant );
} else {
$have_warned++ or warn
"*** Inconsistent state ***\n",
"Observed instances have gone away " .
"without invoking Class::Observable::DESTROY\n";
}
}
};
} else {
*NEEDS_REGISTRY = sub () { 0 };
lib/Class/Observable.pm view on Meta::CPAN
sub DESTROY {
my $invocant = shift;
my $addr = refaddr $invocant;
delete $registry{ $addr } if NEEDS_REGISTRY and $addr;
delete $O{ $addr || "::$invocant" };
}
sub add_observer {
my $invocant = shift;
my $addr = refaddr $invocant;
Scalar::Util::weaken( $registry{ $addr } = $invocant ) if NEEDS_REGISTRY and $addr;
push @{ $O{ $addr || "::$invocant" } }, @_;
}
sub delete_observer {
my $invocant = shift;
my $addr = refaddr $invocant;
my $observers = $O{ $addr || "::$invocant" } or return 0;
my %removal = map +( refaddr( $_ ) || "::$_" => 1 ), @_;
@$observers = grep !$removal{ refaddr( $_ ) || "::$_" }, @$observers;
if ( ! @$observers ) {
( run in 0.893 second using v1.01-cache-2.11-cpan-65fba6d93b7 )