package Net::Rendezvous::Publish; use strict; use warnings; use Net::Rendezvous::Publish::Service; use Module::Pluggable search_path => [ "Net::Rendezvous::Publish::Backend" ], sub_name => 'backends'; use base qw( Class::Accessor::Lvalue ); __PACKAGE__->mk_accessors(qw( _backend _published )); our $VERSION = 0.04; sub new { my $class = shift; my %args = @_; my $self = $class->SUPER::new; my ($backend) = $args{backend} || (grep !/::Null$/, $self->backends)[0]; $backend ||= "Net::Rendezvous::Publish::Backend::Null"; eval "require $backend" or die $@; return unless $backend; $self->_backend = $backend->new or return; $self->_published = []; return $self; } sub publish { my $self = shift; my $service = Net::Rendezvous::Publish::Service->new; $service->_session = $self; $service->_handle = $self->_backend->publish( object => $service, @_ ) or return; return $service; } sub step { my $self = shift; $self->_backend->step( shift ); return $self; } 1; __END__ =head1 NAME Net::Rendezvous::Publish - publish Rendezvous services =head1 SYNOPSIS use Net::Rendezvous::Publish; my $publisher = Net::Rendezvous::Publish->new or die "couldn't make a Responder object"; my $service = $publisher->publish( name => "My HTTP Server", type => '_http._tcp', port => 12345, ); while (1) { $publisher->step( 0.01 ) } =head1 DESCRIPTION =head1 METHODS =head2 new Creates a new publisher handle =head2 publish( %definition ) Returns a Net::Rendezvous::Publish::Service object. The following keys are meaningful in the service definition hash. =over =item name A descriptive name for the service. =item type The type of service. This is string of the form _service._protocol. =item port The port on which you're advertising the service. If you're not using a port (and instead just using mDNS as a way of propogating other service information) it's common practice to use 9 (the discard service) =item domain The domain in which to advertise a service. Defaults to C =back =head2 step( $seconds ) Spend at most $seconds seconds handling network events and updating internal state. =head TODO At some point I may learn enough of the mDNS protocol to write a pure-perl responder. That'll be nifty. =head1 AUTHOR Richard Clamp =head1 COPYRIGHT Copyright 2004, 2005, 2006, Richard Clamp. All Rights Reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 SEE ALSO L - for service browsing. L - you'll need one of these to talk to your local mDNS responder. =cut