skeleton BUILDALL support
[catagits/Web-Simple.git] / lib / Web / Simple / Application.pm
index c00c50c..c115e6e 100644 (file)
@@ -61,7 +61,25 @@ use warnings FATAL => 'all';
 sub new {
   my ($class, $data) = @_;
   my $config = { $class->_default_config, %{($data||{})->{config}||{}} };
-  bless({ config => $config }, $class);
+  my $new = bless({ config => $config }, $class);
+  $new->BUILDALL($data);
+  $new;
+}
+
+sub BUILDALL {
+  my ($self, $data) = @_;
+  my $targ = ref($self);
+  my @targ;
+  while ($targ->isa(__PACKAGE__) and $targ ne __PACKAGE__) {
+    push(@targ, "${targ}::BUILD")
+      if do { no strict 'refs'; defined *{"${targ}::BUILD"}{CODE} };
+    my @targ_isa = do { no strict 'refs'; @{"${targ}::ISA"} };
+    die "${targ} uses Multiple Inheritance: ISA is: ".join ', ', @targ_isa
+      if @targ_isa > 1;
+    $targ = $targ_isa[0];
+  }
+  $self->$_($data) for reverse @targ;
+  return;
 }
 
 sub _setup_default_config {
@@ -171,7 +189,7 @@ sub _build_dispatcher_from_spec {
   my $proto = prototype $spec;
   my $parser = $class->_build_dispatch_parser;
   my $matcher = (
-    defined($proto)
+    defined($proto) && length($proto)
       ? $parser->parse_dispatch_specification($proto)
       : undef
   );
@@ -223,7 +241,8 @@ sub _run_with_self {
 }
 
 sub run_if_script {
-  return 1 if caller(1); # 1 so we can be the last thing in the file
+  # ->as_psgi_app is true for require() but also works for plackup
+  return $_[0]->as_psgi_app if caller(1);
   my $class = shift;
   my $self = $class->new;
   $self->run(@_);
@@ -232,7 +251,12 @@ sub run_if_script {
 sub _run_cgi {
   my $self = shift;
   require Web::Simple::HackedPlack;
-  Plack::Server::CGI->run(sub { $self->_dispatch(@_) });
+  Plack::Server::CGI->run($self->as_psgi_app);
+}
+
+sub as_psgi_app {
+  my $self = shift;
+  ref($self) ? sub { $self->_dispatch(@_) } : sub { $self->new->_dispatch(@_) }
 }
 
 sub run {