
=head1 NAME

Net::SIP::Registrar - Endpoint for registering SIP clients

=head1 SYNOPSIS

  my $reg = Net::SIP::Registry->new(
	dispatcher => $dispatcher,
	min_expires => 10,
	max_expires => 60,
	domains => [ 'example.com','example.org' ],
  );

=head1 DESCRIPTION

This package implements a simple SIP registrar. In the current implementation
registry information are only kept in memory, e.g. they are not preserved over
restarts.

=head1 CONSTRUCTOR

=over 4

=item new ( %ARGS )

This creates a new registar object, %ARGS can have the following keys:

=over 8

=item dispatcher

L<Net::SIP::Dispatcher> object manging the registar. Mandatory.

=item max_expires

Maximum expires time accepted. If the client requests a larger
expires value it will be capped at B<max_expires>
Defaults to 300.

=item min_expires

Minimum expires value. If the client requests a smaller value
the registrar will return a response of C<< 423 Interval too brief >>.
Defaults to 30.

=item domains or domain

Either string or reference to list of strings containing the names
of the domains the registrar is responsable for. If not given the
registrar accepts everything.

=back

=back

=head1 METHODS

=over 4

=item receive ( PACKET,LEG,FROM )

PACKET is the incoming packet,
LEG is the L<Net::SIP::Leg> where the packet arrived and FROM
is the C<< "ip:port" >> of the sender. Responses will be send
back to the sender through the same leg.

Called from the managing L<Net::SIP::Dispatcher> object if a new
packet arrives. Will return C<()> and ignore the packet if it's
not a REGISTER request or if it is not responsable for the domain
given in the C<From> heeader of the REGISTER request.

If it is responsable for the packet it will create a response
and return the code of the response. Responses are either
C<< 423 Interval too brief >> if the request expires time
is too small, or C<< 200 Ok >> if the expires time is 0 (e.g. the
client should be unregistered) or greater or equal B<min_expires>.

In case of a successful response it wil also update the internal
registry information.

=item query ( ADDR )

Search for ADDR (which has format C<< proto:user@domain >>)
in the registry. Returns @List of all sip or sips contacts
for ADDR.

=item expire

Removes all expired entries from the internal registry.
Called whenever the registry information gets updated from
sub B<receive>.

=back
