The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
package Template::Plugin::HTTP::UserAgent;
use 5.10.0;
use strict;
use warnings;
use parent 'Template::Plugin';
use HTML::ParseBrowser;

our $VERSION = '0.06';

sub new
{
    my $class   = shift;
    my $context = shift;
    my $ua;

    if (@_ == 0 && !exists($ENV{HTTP_USER_AGENT})) {
        return $class->error('No User-Agent string given');
    }

    $ua = HTML::ParseBrowser->new(@_ > 0 ? shift : $ENV{HTTP_USER_AGENT});

    if (!defined($ua)) {
        return $class->error("Failed to instantiate HTML::ParseBrowser");
    }

    bless {
        UA => $ua,
    }, $class;
}

sub name    { return $_[0]->{UA}->name;  }
sub version { return $_[0]->{UA}->v;     }
sub major   { return $_[0]->{UA}->major; }
sub minor   { return $_[0]->{UA}->minor; }
sub os      { return $_[0]->{UA}->os;    }

1;

__END__

=head1 NAME

Template::Plugin::HTTP::UserAgent - Template plugin for parsing HTTP User-Agent string

=head1 SYNOPSIS

  [% USE ua = HTTP::UserAgent %]
  [% IF ua.name == 'Internet Explorer' && ua.major <= 7 %]
    <p>I'm sorry Dave, I can't let you do that.</p>
  [% ELSE %]
    ... whew ...
  [% END %]

=head1 DESCRIPTION

Template::Plugin::HTTP::UserAgent is a plugin for the Template Toolkit
which is used to extract information from an HTTP User-Agent string.
The User-Agent string can come from one of two places.
Either you pass the string to the constructor:

  [% USE ua = HTTP::UserAgent('Opera/9.64 (X11; Linux i686; U; da) Presto/2.1.1')

If you don't pass a string to the constructor,
it will check to see whether the HTTP_USER_AGENT environment variable is set,
and if so will use that.

  [% USE ua = HTTP::UserAgent %]

=head1 METHODS

The module supports the following methods.

=over 4

=item name

The name of the user agent (e.g. web browser, crawler).
In general this is the name that appears in the User-Agent string.
Internet Explorer identifies itself as 'MSIE' in the User-Agent string,
but this method returns 'Internet Explorer'.

=item version

The full version string.
For example the User-Agent string containing 'Camino/1.0rc1' will
return '1.0rc1' as the version string.

=item major

The major version number. For Safari 3.1.1, this method will return 3.

=item minor

The minor version number. For Iron 6.0.475.1, this method will return 0.

=item os

The string which identifies the operating system on which the User-Agent is running.

=back

At the moment Template::Plugin::HTTP::UserAgent uses
L<HTML::ParseBrowser> internally.
That module supports more methods for extracting information
from User-Agent strings than are provided here.
Some of those methods might be added in the future --
let me know if you want one or more of them.
Template::Plugin::HTTP::UserAgent might switch to using
a different module internally,
which is why I've started off with a generic set of methods initially.

=head1 REPOSITORY

L<https://github.com/neilbowers/Template-Plugin-HTTP-UserAgent>

=head1 SEE ALSO

L<Template::Plugin::MobileAgent>,
L<HTML::ParseBrowser>.

=head1 AUTHOR

Neil Bowers E<lt>neilb@cpan.orgE<gt>

=head1 COPYRIGHT

Copyright 2012 Neil Bowers. All rights reserved.

This module is free software;
you can redistribute it and/or modify it under the same terms as Perl itself.