The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

package threads::tbb::refcounter;

use Carp;
our $VERSION = '0.01';

sub import {
    my $package = shift;

    my @package;
    for my $arg ( @_ ) {
	if ( $arg =~ m{^\d+(\.\d+.*)?$} ) {
	    if ( $arg gt $VERSION ) {
		croak "version $arg requested - this is "
		    .__PACKAGE__." $VERSION";
	    }
	}
	push @package, $arg;
    }
    for my $pkg ( @package ) {
	$package->setup($pkg);
    }
}

sub setup {
    no strict 'refs';
    no warnings 'redefine';
    shift if UNIVERSAL::isa($_[0], __PACKAGE__);
    my $target = shift;
    my $destroy = "${target}::DESTROY";
    my $destroy_rc = "${target}::_DESTROY_tbbrc";
    my $refcnt_inc = "${target}::CLONE_REFCNT_inc";
    my $clone_skip = "${target}::CLONE_SKIP";

    # multiple modules can call this, don't re-setup.
    return if defined &$destroy_rc;

    # find the DESTROY method and wrap it.
    croak "no DESTROY defined in $target; did you load it, and are you sure it's a real XS class?"
	unless defined &$destroy;

    *$destroy_rc = \&$destroy;
    *$destroy = \&pvmg_rc_dec;
    *$refcnt_inc = \&pvmg_rc_inc;
    *$clone_skip = \&clone_skip;
}

sub clone_skip { 0 }

1;