/usr/local/CPAN/JS-jQuery-Loader/JS/jQuery/Loader/Location.pm
package JS::jQuery::Loader::Location;
use Moose;
extends qw/JS::jQuery::Loader::Source/;
use JS::jQuery::Loader::Carp;
use JS::jQuery::Loader::Template;
use Path::Class;
use URI;
has template => qw/is ro required 1 lazy 1 isa JS::jQuery::Loader::Template/, default => sub { return JS::jQuery::Loader::Template->new };
has location_pattern => qw/is rw/, default => "\%j";
has file_pattern => qw/is rw/;
has uri_pattern => qw/is rw/;
has location => qw/is rw/;
has file => qw/is rw/;
has uri => qw/is rw/;
sub BUILD {
my $self = shift;
my $given = shift;
defined $given->{$_} and $self->{"$_\_pattern"} = $given->{$_} for qw/location file uri/;
$self->recalculate;
}
sub recalculate {
my $self = shift;
my $process_location = sub { return shift };
my ($uri, $file, $location);
if ($self->location_pattern) {
$location = $self->{location} = $self->template->process($self->location_pattern);
$process_location = sub {
my $template = shift;
my $result = $template;
$result =~ s/\%l/$location/g;
$result =~ s/\%\.l/$location ? "\.$location" : ""/ge;
$result =~ s/\%\-l/$location ? "\-$location" : ""/ge;
$result =~ s/\%\/l/$location ? "\/$location" : ""/ge;
return $result;
};
}
if ($self->uri_pattern) {
my $result = $self->template->process($self->uri_pattern);
$uri = $process_location->($result);
}
$uri = $self->{uri} = defined $uri ? URI->new($uri) : undef;
if ($self->file_pattern) {
my $result = $self->template->process($self->file_pattern);
$file = $process_location->($result);
}
$file = $self->{file} = defined $file ? Path::Class::File->new($file) : undef;
return 1;
}
for my $attribute qw/location file uri/ {
my $attribute_pattern = "$attribute\_pattern";
around $attribute => sub {
my $inner = shift;
my $self = shift;
return $self->$inner() unless @_;
$self->$attribute_pattern(@_);
return $self->recalculate && $self->{$attribute};
}
}
1;
__END__
has base_uri => qw/is ro/, default => "";
has base_dir => qw/is ro/, default => "";
has uri => qw/is ro lazy_build 1/;
sub _build_uri {
my $self = shift;
my $uri = $self->base_uri || "";
$uri .= $self->location;
return URI->new($uri);
};
has file => qw/is ro lazy_build 1/;
sub _build_file {
my $self = shift;
my $file = $self->base_dir || "";
return concatenate_file $file, $self->location;
};
sub concatenate_uri($$) {
my $base = shift;
my $location = shift;
my $uri = $base . $location;
return URI->new($uri);
}
sub concatenate_file($$) {
my $base = shift;
my $location = shift;
return $base->file($file) if blessed $base && $base->isa("Path::Class::Dir");
croak "Don't know how to concatenate $base and $location" if blessed $base && $base->isa("Path::Class::File");
return Path::Class::File->new($base . $location);
}