}
# Filter a component before returning by calling ACCEPT_CONTEXT if available
+
+#our %tracker = ();
sub _filter_component {
my ( $c, $comp, @args ) = @_;
+ # die "Circular Dependencies Detected." if $tracker{$comp};
+ # $tracker{$comp}++;
if(ref $comp eq 'CODE') {
$comp = $comp->();
}
+ #$tracker{$comp}++;
if ( eval { $comp->can('ACCEPT_CONTEXT'); } ) {
return $comp->ACCEPT_CONTEXT( $c, @args );
}
for my $component (@comps) {
- my $instance = $class->components->{ $component } = $class->setup_component($component);
+ my $instance = $class->components->{ $component } = $class->delayed_setup_component($component);
}
# Inject a component or wrap a stand alone class in an adaptor. This makes a list
return Devel::InnerPackage::list_packages( $module );
}
+=head2 $app->delayed_setup_component
+
+Returns a coderef that points to a setup_component instance. Used
+internally for when you want to delay setup until the first time
+the component is called.
+
+=cut
+
+sub delayed_setup_component {
+ my($class, $component, @more) = @_;
+ return sub {
+ return my $instance = $class->setup_component($component, @more);
+ };
+}
+
=head2 $c->setup_component
=cut
sub setup_component {
my( $class, $component ) = @_;
-return sub {
unless ( $component->can( 'COMPONENT' ) ) {
return $component;
}
);
}
-my @expanded_components = $instance->can('expand_modules')
- ? $instance->expand_modules( $component, $config )
- : $class->expand_component_module( $component, $config );
-for my $component (@expanded_components) {
- next if $class->components->{ $component };
- $class->components->{ $component } = $class->setup_component($component);
-}
+ my @expanded_components = $instance->can('expand_modules')
+ ? $instance->expand_modules( $component, $config )
+ : $class->expand_component_module( $component, $config );
+ for my $component (@expanded_components) {
+ next if $class->components->{ $component };
+ $class->components->{ $component } = $class->setup_component($component);
+ }
return $instance;
}
-}
-
=head2 $c->setup_dispatcher
Sets up dispatcher.
my $_setup_component = sub {
my $into = shift;
my $component_package = shift;
- $into->components->{$component_package} = $into->setup_component( $component_package );
+ $into->components->{$component_package} = $into->delayed_setup_component( $component_package );
};
$_setup_component->( $into, $component_package );
- # for my $inner_component_package ( Devel::InnerPackage::list_packages( $component_package ) ) {
- # $_setup_component->( $into, $inner_component_package );
- # }
}
=head1 PSGI Helpers
sub user :Local Args(1) {
my ($self, $c, $int) = @_;
- my $user = $c->model("User")->find($int);
-
- $c->model("User")->zoo->a;
+
+ Test::More::ok(my $user = $c->model("User")->find($int));
+ Test::More::ok($c->model("User")->zoo->a);
$c->res->body("name: $user->{name}, age: $user->{age}");
}
},
'Model::Zoo' => {
from_component => 'Local::Model::Foo',
- args => {a=>2},
+ args => { a=>2 },
},
'Model::Foo' => {
from_component => 'Local::Model::Foo',
args => { a=> 100 },
},
-
});
MyApp->setup;