1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
|
package URI::WithBase;
use strict;
use vars qw($AUTOLOAD);
use URI;
use overload '""' => "as_string", fallback => 1;
sub as_string; # help overload find it
sub new
{
my($class, $uri, $base) = @_;
my $ibase = $base;
if ($base && UNIVERSAL::isa($base, "URI::WithBase")) {
$base = $base->abs;
$ibase = $base->[0];
}
bless [URI->new($uri, $ibase), $base], $class;
}
sub _init
{
my $class = shift;
my($str, $scheme) = @_;
bless [URI->new($str, $scheme), undef], $class;
}
sub eq
{
my($self, $other) = @_;
$other = $other->[0] if UNIVERSAL::isa($other, "URI::WithBase");
$self->[0]->eq($other);
}
sub AUTOLOAD
{
my $self = shift;
my $method = substr($AUTOLOAD, rindex($AUTOLOAD, '::')+2);
return if $method eq "DESTROY";
$self->[0]->$method(@_);
}
sub base {
my $self = shift;
my $base = $self->[1];
if (@_) { # set
my $new_base = @_;
$new_base = $new_base->abs if ref($new_base); # ensure absoluteness
$self->[1] = $new_base;
}
return unless defined wantarray;
# The base attribute supports 'lazy' conversion from URL strings
# to URL objects. Strings may be stored but when a string is
# fetched it will automatically be converted to a URL object.
# The main benefit is to make it much cheaper to say:
# URI::WithBase->new($random_url_string, 'http:')
if (defined($base) && !ref($base)) {
$base = URI->new($base);
$self->[1] = $base unless @_;
}
$base;
}
sub clone
{
my $self = shift;
bless [$self->[0]->clone, $self->[0]], ref($self);
}
sub abs
{
my $self = shift;
my $base = shift || $self->base || return $self->clone;
bless [$self->[0]->abs($base, @_), $base], ref($self);
}
sub rel
{
my $self = shift;
my $base = shift || $self->base || return $self->clone;
bless [$self->[0]->rel($base, @_), $base], ref($self);
}
1;
__END__
=head1 NAME
URI::WithBase - URI which remember their base
=head1 SYNOPSIS
$u1 = URI::WithBase->new($str, $base);
$u2 = $u1->abs;
$base = $u1->base;
$u1->base( $new_base )
=head1 DESCRIPTION
This module provide the C<URI::WithBase> class. Objects of this class
are like C<URI> objects, but can keep their base too.
The methods provided in addition to or modified from those of C<URI> are:
=over 4
=item $uri = URI::WithBase->new($str, [$base])
The constructor takes a an optional base URI as the second argument.
=item $uri->base( [$new_base] )
This method can be used to get or set the value of the base attribute.
=item $uri->abs( [$base_uri] )
The $base_uri argument is now made optional as the object carries it's
base with it.
=item $uri->rel( [$base_uri] )
The $base_uri argument is now made optional as the object carries it's
base with it.
=back
=head1 SEE ALSO
L<URI>
=head1 COPYRIGHT
Copyright 1998 Gisle Aas.
=cut
|