package MyComponent; use strict; use warnings; use Test::More; use Scalar::Util qw/weaken/; use parent 'Plack::Component'; sub call { my $self = shift; my $env = shift; if( $env->{PATH_INFO} eq '/run_response_cb' ){ my $my; # Record $res and $cb $self->{res} = [200, ['Content-Type' => 'text/plain'], ['OK']]; $self->{cb} = sub { $my }; # Contain $my to be regard as a closure. return $self->response_cb($self->{res}, $self->{cb}); }else{ # Decrease REFCNT weaken $self->{res}; weaken $self->{cb}; # Check if references are released. return [ 200, [ 'Content-Type' => 'text/plain', 'X-Res-Freed' => ! $self->{res}, 'X-Cb-Freed' => ! $self->{cb}, ], ['HELLO'] ]; } } package main; use strict; use warnings; use Test::More; use Plack::Test; use HTTP::Request::Common; $Plack::Test::Impl = "Server"; local $ENV{PLACK_SERVER} = "HTTP::Server::PSGI"; my $app = MyComponent->new; test_psgi( $app->to_app, sub { my $cb = shift; $cb->(GET '/run_response_cb'); my $req = $cb->(GET '/check'); ok $req->header('X-Res-Freed'), '$res has been released.'; ok $req->header('X-Cb-Freed') , '$cb has been released.'; } ); done_testing;