sub build_per_context_instance {
my ($self, $c, @args) = @_;
- my $newself = $self->new($self->_application, {%$self, context => $c, @args});
- weaken $newself->{context}; #stopgap till cat 5.8
+ my $class = ref($self) || $self;
+ my $newself = $class->new($self->_application, {%$self, context => $c, @args});
return $newself;
}
$vp_attr = $vp_attr->[0];
}
if (ref($vp_attr) eq 'HASH') {
- if (my $conf_class = delete $vp_attr->{class}) {
- $class = $conf_class;
- }
+ $class = $vp_attr->{class} if defined $vp_attr->{class};
%args = %{ $self->merge_config_hashes($vp_attr, {@proto_args}) };
} else {
$class = $vp_attr;
}
sub redirect_to {
- my ($self, $c, $to, $cap, $args, $attrs) = @_;
+ my ($self, $c, $to, $cap, $args, $attrs, $domain) = @_;
#the confess calls could be changed later to $c->log ?
my $action;
$args ||= $c->req->args;
$attrs ||= {};
my $uri = $c->uri_for($action, $cap, @$args, $attrs);
+ $uri->host($domain) if $domain;
$c->res->redirect($uri);
}
$captures and $args default to the current requests $captures and
$args if not supplied.
+=head2 make_context_closure
+
+The purpose of this method is to prevent memory leaks.
+It weakens the context object, often denoted $c, and passes it as the
+first argument to the sub{} that is passed to the make_context_closure method.
+In other words,
+
+=over 4
+
+make_context_closure returns sub { $sub_you_gave_it->($weak_c, @_)
+
+=back
+
+To further expound up this useful construct consider code written before
+make_context_closure was created:
+
+ on_apply_callback =>
+ sub {
+ $self->after_search( $c, @_ );
+ }
+ ),
+
+This could be rewritten as:
+
+ on_apply_callback => $self->make_context_closure(
+ sub {
+ my $weak_c = shift;
+ $self->after_search( $weak_c, @_ );
+ }
+ ),
+
+Or even more succintly:
+
+ on_apply_callback => $self->make_context_closure(
+ sub {
+ $self->after_search( @_ );
+ }
+ ),
+
=head1 AUTHORS
See L<Reaction::Class> for authors.