AcePerl
view release on metacpan or search on metacpan
Ace/Browser/SiteDefs.pm view on Meta::CPAN
=head1 AUTHOR
Lincoln Stein <lstein@cshl.org>.
Copyright (c) 2001 Cold Spring Harbor Laboratory
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself. See DISCLAIMER.txt for
disclaimers of warranty.
=cut
use CGI();
use Ace();
use strict;
use Carp;
use vars qw($AUTOLOAD);
# get location of configuration file
use Ace::Browser::LocalSiteDefs '$SITE_DEFS';
my %CONFIG;
my %CACHETIME;
my %CACHED;
sub getConfig {
my $package = shift;
my $name = shift;
croak "Usage: getConfig(\$database_name)" unless defined $name;
$package = ref $package if ref $package;
my $file = "${name}.pm";
# make search relative to SiteDefs.pm file
my $path = $package->get_config || $package->resolveConf($file);
return unless -r $path;
return $CONFIG{$name} if exists $CONFIG{$name} and $CACHETIME{$name} >= (stat($path))[9];
return unless $CONFIG{$name} = $package->_load($path);
$CONFIG{$name}->{'name'} ||= $name; # remember name
$CACHETIME{$name} = (stat($path))[9];
return $CONFIG{$name};
}
sub modtime {
my $package = shift;
my $name = shift;
if (!$name && ref($package)) {
$name = $package->Name;
}
return $CACHETIME{$name};
}
sub AUTOLOAD {
my($pack,$func_name) = $AUTOLOAD=~/(.+)::([^:]+)$/;
my $self = shift;
croak "Unknown field \"$func_name\"" unless $func_name =~ /^[A-Z]/;
return $self->{$func_name} = $_[0] if defined $_[0];
return $self->{$func_name} if defined $self->{$func_name};
# didn't find it, so get default
return if (my $dflt = $pack->getConfig('default')) == $self;
return $dflt->{$func_name};
}
sub DESTROY { }
sub map_url {
my $self = shift;
my ($display,$name,$class) = @_;
$class ||= $name->class if ref($name) and $name->can('class');
my (@result,$url);
if (my $code = $self->Url_mapper) {
if (@result = $code->($display,$name,$class)) {
return @result;
}
}
# if we get here, then take the first display
my @displays = $self->displays($class,$name);
push @displays,$self->displays('default') unless @displays;
my $n = CGI::escape($name);
my $c = CGI::escape($class);
return ($displays[0],"name=$n;class=$c") if $displays[0];
return unless @result = $self->getConfig('default')->Url_mapper->($display,$name,$class);
return unless $url = $self->display($result[0],'url');
return ($url,$result[1]);
}
sub searches {
my $self = shift;
return unless my $s = $self->Searches;
return @{$s} unless defined $_[0];
return $self->Search_titles->{$_[0]};
}
# displays() => list of display names
# displays($name) => hash reference for display
# displays($name=>$field) => displays at {field}
sub display {
my $self = shift;
return unless my $d = $self->Displays;
return keys %{$d} unless defined $_[0];
return unless exists $d->{$_[0]};
return $d->{$_[0]} unless defined $_[1];
return $d->{$_[0]}{$_[1]};
}
sub displays {
my $self = shift;
return unless my $d = $self->Classes;
return keys %$d unless @_;
my ($class,$name) = @_;
my $type = ucfirst(lc($class));
return unless exists $d->{$type};
my $value = $d->{$type};
if (ref $value eq 'CODE') { # oh, wow, a subroutine
my @v = $value->($type,$name); # invoke to get list of displays
return wantarray ? @v : \@v;
} else {
return wantarray ? @{$value} : $value;
}
}
sub class2displays {
my $self = shift;
my ($class,$name) = @_;
# No class specified. Return name of all defined classes.
return $self->displays unless defined $class;
# A class is specified. Map it into the list of display records.
my @displays = map {$self->display($_)} $self->displays($class,$name);
return @displays;
}
sub _load {
my $package = shift;
my $file = shift;
no strict 'vars';
no strict 'refs';
$file =~ m!([/a-zA-Z0-9._-]+)!;
my $safe = $1;
( run in 0.826 second using v1.01-cache-2.11-cpan-39bf76dae61 )