use Scalar::Util qw(weaken);