Class-Observable

 view release on metacpan or  search on metacpan

Changes  view on Meta::CPAN

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 )