## Domain Registry Interface, RegistryObject
##
## Copyright (c) 2005,2013 Patrick Mevzek <netdri@dotandco.com>. All rights reserved.
##
## This file is part of Net::DRI
##
## Net::DRI is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
## the Free Software Foundation; either version 2 of the License, or
## (at your option) any later version.
##
## See the LICENSE file that comes with this distribution for more details.
#########################################################################################
use strict;
our $AUTOLOAD;
=pod
=head1 NAME
Net::DRI::Data::RegistryObject - Additional API for Net::DRI operations
=head1 SYNOPSYS
my $dri=Net::DRI->new();
my $nsg=$dri->remote_object('nsgroup');
$nsg->create(...);
$nsg->update(...);
$nsg->whatever(...);
Also:
my $nsg=$dri->remote_object('nsgroup','name');
=head1 DESCRIPTION
For objects other than domains, hosts, or contacts, Net::DRI::Data::RegistryObject
can be used to apply actions.
Net::DRI::remote_object is used to create a new Net::DRI::Data::RegistryObject
with either only one parameter (the object type) or two parameters (the object
type and the object name)
If the object name is not passed at creation it will need to be passed for all
later actions as first parameter.
All calls are handled by an AUTOLOAD, except target() which is the same as in Net::DRI.
All calls need either two array references (protocol parameters and transport parameters)
or a list (protocol parameters only).
=head1 SUPPORT
For now, support questions should be sent to:
E<lt>netdri@dotandco.comE<gt>
Please also see the SUPPORT file in the distribution.
=head1 SEE ALSO
=head1 AUTHOR
Patrick Mevzek, E<lt>netdri@dotandco.comE<gt>
=head1 COPYRIGHT
Copyright (c) 2005,2013 Patrick Mevzek <netdri@dotandco.com>.
All rights reserved.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
See the LICENSE file that comes with this distribution for more details.
=cut
###########################################################################################################
sub new
{
my ($class,$p,$type,$name)=@_; ## $name (object name) not necessarily defined
Net::DRI::Exception::err_invalid_parameters() unless (defined($p) && ((ref($p) eq 'Net::DRI') || (ref($p) eq 'Net::DRI::Registry')));
Net::DRI::Exception::err_insufficient_parameters() unless (defined($type) && $type);
my $self={
p => $p,
type => $type,
name => $name,
};
bless($self,$class);
return $self;
}
sub target
{
my ($self,@args)=@_;
$self->{p}->target(@args);
return $self;
}
sub AUTOLOAD ## no critic (Subroutines::RequireFinalReturn)
{
my ($self,@args)=@_;
my $attr=$AUTOLOAD; ## this is the action wanted on the object
$attr=~s/.*:://;
return unless $attr=~m/[^A-Z]/; ## skip DESTROY and all-cap methods
my $name=$self->{name};
my ($rp,$rt);
if (@args==2 && (ref $args[0] eq 'ARRAY') && (ref $args[1] eq 'ARRAY'))
{
$rp=$args[0];
$rp=[ $self->{name}, @$rp ] if (defined $name && $name);
$rt=$args[1];
} else
{
$rp=(defined $name && $name)? [ $name, @args ] : [ @args ];
$rt=[];
}
my $p=$self->{p};
if (ref $p eq 'Net::DRI::Registry')
{
return $p->process($self->{type},$attr,$rp,$rt);
} elsif (ref $p eq 'Net::DRI')
{
my $c=$self->{type}.'_'.$attr;
return $p->$c->(@$rp);
} else
{
Net::DRI::Exception::err_assert('case not handled: '.ref($p));
}
}
###########################################################################################################
1;