package Squatting::With::PerHostConfig; use common::sense; # # It's up to you to define a custom class method called lookup_config_for_host! # # Given a host, return a config hashref. sub config_for_host { my ($class, $host) = @_; if ($class->can('lookup_config_for_host')) { return $class->lookup_config_for_host($host); } else { return undef; } } # If a custom config is found, merge %CONFIG with the contents of the custom config. sub service { no strict 'refs'; my ($class, $c, @args) = @_; my $host_config = $class->config_for_host($c->env->{HTTP_HOST}); if ($host_config) { my $config = \%{$class . "::CONFIG"}; local %{$class . "::CONFIG"} = %$config; for (keys %$host_config) { ${$class . "::CONFIG"}{$_} = $host_config->{$_}; } $class->next::method($c, @args); } else { $class->next::method($c, @args); } } 1; __END__ =head1 NAME Squatting::With::PerHostConfig - vary %CONFIG based on $c->env->{HTTP_HOST} =head1 SYNOPSIS First, define a lookup_config_for_host method. use Rhetoric 'With::PerHostConfig'; { package Rhetoric; our %HOST_CONFIG = ( 'localhost' => { theme => 'default', }, 'test1.local' => { theme => 'scary', }, m.local => { theme => 'mobile', }, ); # How you choose to implement this method is completely up to you. # Feel free to pull data from a database if you so desire. sub lookup_config_for_host { my ($class, $host) = @_; return $HOST_CONFIG{$host}; } } =head1 DESCRIPTION This plugin lets you vary a Squatting app's %CONFIG based on the host name used to make the HTTP request. =cut # Local Variables: *** # mode: cperl *** # indent-tabs-mode: nil *** # cperl-close-paren-offset: -2 *** # cperl-continued-statement-offset: 2 *** # cperl-indent-level: 2 *** # cperl-indent-parens-as-block: t *** # cperl-tab-always-indent: nil *** # End: *** # vim:tabstop=2 softtabstop=2 shiftwidth=2 shiftround expandtab =cut