The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
NAME
    Net::YAR - Perl interface to the YAR (Yet Another Registrar) API

SYNOPSIS
        use Net::YAR;

        my $yar = Net::YAR->new({
            api_user => 'my_user',
            api_pass => 'my_pass',
            api_host => 'api.fastdomain.com',
        });



        ### test if the server can connect

        my $resp = $yar->util->noop; # calls YAR method util.noop
        # OR
        # my $resp = $yar->util_noop;  # calls YAR method util.noop

        use Data::Dumper qw(Dumper);
        if (! $resp) { # error
            print Dumper $resp->code;
            print Dumper $resp;
        } else {
            print Dumper $resp->data;
        }


        ### information to register a domain in one pass

        my $domain_info = {
            user    => {
                username   => "some_username",
                password   => '123qwe',
                email      => 'foo@my.company.com',
                phone      => '+1.8017659400',
                first_name => 'George',
                last_name  => 'Jones',
            },
            domain     => 'sometestdomain.com',
            duration   => 2,
            registrant => {contact_id => 'admin'},
            admin      => {
                first_name   => 'George',
                last_name    => 'Jones',
                organization => 'My Company Test',
                email        => 'foo@my.company.com',
                street1      => 'Techway',
                street2      => '',
                city         => 'Provo',
                province     => 'UT',
                postal_code  => '84606',
                country      => 'US',
                phone        => '+1.8017659400',
                fax          => '',
            },
            billing    => {contact_id => 'admin'},
            tech       => {contact_id => 'admin'},
            nameservers => [
                "ns1.fastdomain.com",
                "ns2.fastdomain.com",
            ],
        };

        my $r = $yar->domain->register($domain_info);

        my $info = $r->data;
        # info now contains
        # $info->{'domain_id'}              The id of the created domain
        # $info->{'contact_id_admin'}       The admin contact handle id
        # $info->{'contact_id_registrant'}, The registrant contact handle id
        # $info->{'contact_id_billing'},    The billing contact handle id
        # $info->{'contact_id_tech'},       The tech contact handle id
        # $info->{'user_id'},               The id of the new user
        # $info->{'offer_id'},              The id of the offer used
        # $info->{'invoice_id'},            The id of the new invoice
        # $info->{'order_id'},              The id of the new order

DESCRIPTION
    The Net::YAR module provides a perl interface to the FastDomain YAR (Yet
    Another Registrar) API Service. In order to use this module, you must
    have an agent account setup at either FastDomain.com or another
    registrar that supports the YAR API. If you would like to register
    domains using this API please contact either FastDomain.com or the YAR
    API registrar of choice.

    You will also need to have one of JSON, YAML, YAML::Syck, XML::Simple,
    or Data::URIEncode installed to facilitate serializing and deserializing
    the requests to the YAR service.

Net::YAR SPECIFIC METHODS
    The following is the list of methods used for controlling connections to
    the YAR server as well as setup of the Net::YAR object.

    new Takes a hashref of arguments and returns an object blessed into the
        Net::YAR class.

            my $yar = Net::YAR->new({
                api_user => $user,
                api_pass => $pass,
                api_host => $host,
                serialize_type => 'json',
                ssl      => 1,
            });

    api_user
        Should return the username of the Registrar Account to be logged in
        under. It may be initialized during the new method.

    api_pass
        Should return the password of the Registrar Account to be logged in
        under. It may be initialized during the new method.

    api_host
        Should return the host to connect to for YAR commands. It may be
        initialized during the new method.

    api_port
        Default 443 if use_ssl is true, 80 otherwise. Should return the port
        to connect to for YAR commands.

    use_ssl
        Defaults to $self->{use_ssl} which defaults to $self->{ssl} which
        defaults to 1.

        Setting to a true value will perform requests across a secure
        connection. Production systems will only support ssl.

    ssl_verify_hostname
        Defaults to $self->{ssl_verify_hostname} which defaults 0.

        Setting to a true value will perform certificate matching.

    api_path
        Default /cgi/yar. Should return the path to locate on host for YAR
        commands.

    log_file
        Default undef. If set to a true value, will be used by the log_obj
        method to return an IO::File object that will be used to log the
        methods that were called.

        This may be initilized during the new method by passing log_file as
        a named argument.

    log_obj
        Default action is to look for a file returned by the log_file method
        and open an IO::File object on it. Can be initialized during the
        "new" method. Should contain an object that can do the "print"
        method. Any external request and any external response that occurs
        during play_method will be passed to the print method.

        The following is a very simple base class that records the details
        in a scalar, though it would be easy to log to a file or a database:

            package MyLogger;

            sub new { bless {str => ""}, __PACKAGE__ }

            sub print { shift->{'str'} .= join "", @_ }

            sub as_string { shift->{'str'} }

    serialize_type
        Should return the method of serialization. The following types are
        supported:

            json
            yaml
            xml
            uri

        If not set, the method will search for installed modules which
        support those types. The modules will be searched in the following
        order:

            JSON (json)
            YAML::Syck (yaml)
            YAML (yaml)
            Data::URIEncode (uri)
            XML::Simple (xml)

        If no installed modules can be found, the method will die.

    play_method
        Takes the YAR method name and a hashref of args to pass to the YAR
        method. Takes care of serializing the request and deserializing the
        response. It will return an object blessed into the
        Net::YAR::Response class for successful methods. It will return an
        object blessed into the Net::YAR::Fault class for failed methods.
        Errors that occur during the external connection will result in a
        Net::YAR::Fault response with a type of 'request_error.

    serialize_request
        Takes the passed data hashref and encodes it using the specified
        serialization type. Errors caused by passed data will result in a
        Net::YAR::Fault response with a type of 'serialize_error'.

    parse_response
        Takes the response from the server and parses it into the
        corresponding data structure. Errors that occur during parsing will
        result in a Net::YAR::Fault response with a type of 'parse_error'.

YAR METHODS
    The YAR API provides various methods for manipulating domain, contact,
    and other records at the FastDomain (or similar) registrar. These
    methods are organized into namespaces that group certain object types
    together. The following is a brief list of the available namespaces
    through Net::YAR.

        Namespace    | Use
        ----------------------------------------------
        contact      | manage domain contact handles
        domain       | manage domain registrations
        invoice      | manage registration invoices
        offer        | browse available offers
        order        | manage domain orders
        user         | manage users (users own domains)
        util         | access various utility functions
        whois        | access parsed whois information

    Not all methods are available to every agent that uses the YAR service.
    Some require additional access or limits. Please check with your YAR
    service contact for more information.

    The Net::YAR object allows access to methods in each of these methods in
    three different ways. The following code shows three ways to access the
    "info" method of the "domain" namespace:

        # 1 - chained proxy object
        #     each namespace has a corresponding proxy method
        #     that allows you to access the namespace as a method.
        my $resp = $yar_obj->domain->info({domain => $domain});

        # 2 - pseudo method call
        my $resp = $yar_obj->domain_info({domain => $domain});

        # 3 - play_method call
        my $resp = $yar_obj->play_method('domain.info', {domain => $domain});

    Though all three methods are equivalent, it is suggested that either
    option 1 or 2 is used.

    The response returned by YAR API methods will be either a
    Net::YAR::Response which is a success value, or they will be a
    Net::YAR::Fault which represents an error. The "data" method can be used
    to access information returned from the response. See the section on
    Net::YAR::Response and Net::YAR::Fault for more information.

    The following sections list the methods available in each namespace.
    This document is not intended to be a comprehensive list of posible
    request types, return values, and codes. For a full listing, please use
    the documentation provided by the YAR service provider.

  CONTACT METHODS
    create
        Runs contact.create. Used for creating new contact handles that can
        be used to install domains.

            my $resp = $yar->contact->create({
                tld          => 'com',
                user_id      => $user_id,
                first_name   => 'George',
                last_name    => 'Jones',
                organization => 'My Company Test',
                email        => 'foo@my.company.com',
                street1      => 'Techway',
                street2      => '',
                city         => 'Provo',
                province     => 'UT',
                postal_code  => '84606',
                country      => 'US',
                phone        => '+1.8017659400',
                fax          => '',
            });

            # $resp->data = {
            #     contact_id => $contact_id,
            # };

        The tld is the top level domain (com, net, org, etc) that this
        contact will be able to be associated with. Each registry maintains
        their own listing of contacts. The tld must match the tld of domains
        that it is associated with.

        The user_id is the user that created the id. A domain may be
        associated with any contact handle, but only the owner user_id
        should be allowed to update the contact information.

        The phone number may be cleaned up prior to this method call using
        the util->phone method.

        If the tld is on the US registry and the contact will be used on a
        registrant contact, then addition nexus fields will need to be
        provided:

            tld              => 'us',
            nexus_purpose    => 'P1',  # see the full YAR documentation for more information
            nexus_category   => 'C21',
            #nexus_validator => 'us',  # required if category is C31 or C32

    delete
        Runs contact.delete. Used for deleting a contact.

    info
        Runs contact.info. Used for querying contact info.

    registrar_info
        Runs contact.registrar_info. Used for getting information about a
        contact directly from the registry for that contact id. Returns an
        error if the contact is not currently installed on the registry.

    search
        Runs contact.search. Used for search for contacts.

           my $resp = $yar->contact->search({
               where => [{field => "user_id", op => '=', value => '736530'},
                         {field => "tld",     op => '=', value => 'com'},
                         ],
           });

        See the full YAR API documentation for a full description of
        available search terms.

    search_all
        Same as search - but automatically assembles rows from queries that
        return on multiple pages.

    update
        Runs contact.update. Used for updating contact information.

  DOMAIN METHODS
    check
        Runs domain.check. Used for checking if domain is available for
        registration - or not.

           my $resp = $yar->domain->check({domain => $domain});

           # $resp->data = {
           #     rows => [{domain => $domain, available => 1}],
           # };

    create
        Runs domain.create. It is suggested you use domain.register instead.
        The create method requires you to already have a user_id, order_id,
        and contact_ids before calling. It also requires you to add
        nameservers later. domain.register does all of this for you.

    delete
        Runs domain.delete. Used for deleting domains from the service.

            my $resp = $yar->domain->delete({domain => $domain});

            # OR

            my $resp = $yar->domain->delete({domain_id => $domain_id});

        Take care when using this command because the registration for the
        domain will be terminated.

    drop_add
        Runs domain.drop_add. Used for trying to drop and add as close to
        atomically as possible. There is no guarantee made that the
        operation will successfully re-add the domain. If errors occur you
        are responsible for trying to re-add the domain.

    info
        Runs domain.info. Used for getting information about a domain.
        Returns an error if the domain is not installed on the YAR server.

            my $info = $yar->domain->info({domain => $domain})->data;

            # OR

            my $info = $yar->domain->info({domain_id => $domain_id})->data;

    register
        Runs domain.register. Used for registering new domains. The register
        method allows for a single method call to install a domain,
        including possibly installing a user, searching for an offer,
        creating an invoice, creating an order, creating the necessary
        contacts, and registering the domain.

        The following information shows a sample of information that would
        install a user, invoice, order, contacts, and domain.

            my $domain_info = {
                user    => {
                    username   => "some_username",
                    password   => '123qwe',
                    email      => 'foo@my.company.com',
                    phone      => '+1.8017659400',
                    first_name => 'George',
                    last_name  => 'Jones',
                },
                domain     => 'sometestdomain.com',
                duration   => 2,
                registrant => {contact_id => 'admin'},
                admin      => {
                    first_name   => 'George',
                    last_name    => 'Jones',
                    organization => 'My Company Test',
                    email        => 'foo@my.company.com',
                    street1      => 'Techway',
                    street2      => '',
                    city         => 'Provo',
                    province     => 'UT',
                    postal_code  => '84606',
                    country      => 'US',
                    phone        => '+1.8017659400',
                    fax          => '',
                },
                billing    => {contact_id => 'admin'},
                tech       => {contact_id => 'admin'},
                nameservers => [
                    "ns1.fastdomain.com",
                    "ns2.fastdomain.com",
                ],
            };

        Specifying the user
            If the user_id is known, then the user key value pair could be
            deleted and replaced with either of the following items.

                user_id => $user_id,

                # OR

                user => {user_id => $user_id},

                # OR

                order_id => $order_id,

            Passing in the user_id allows for multiple domains to be
            associated with a single user. If a newly created order_id is
            passed in, then the user_id from the order will automatically be
            used.

        Specifying duration, offer or order
            The duration key value pair is used to determine how long the
            domain should be registered for and should be presented in
            integer years. You may also pass the following key value pairs:

                offer_id => $offer_id

                # OR

                order_id => $order_id

            If an offer_id is passed in, it will be verified and a new
            invoice and order will be created.

            If an order_id is passed in, it will be verified and the newly
            registered domain will be attached to it.

            If only the duration is passed in, a offer that matches will be
            searched for, and an invoice and order will be created.

        Specifying contacts
            Each of the registrant, admin, billing, and tech contacts can be
            specified by passing arguments in the following ways:

                # 1 - specify an existing contact handle
                #     (the handle must be installed with the YAR service
                #      for the same tld as the domain being registered
                contact_id_registrant => $contact_id,

                # 2 - specify existing handle 2
                #     (similar to #1 but uses registrant hash)
                registrant => {contact_id => $contact_id},

                # 3 - reference other contact
                #     in this sample the registrant will use
                #     the same contact id that the admin contact uses
                registrant => {contact_id => 'admin'},

                # 4 - pass all of the information necessary to create a new contact
                #     (the information passed is the same as that passed
                #      to contact->create except that the user_id and tld are
                #      automatically provided)
                registrant => {
                        first_name   => 'George',
                        last_name    => 'Jones',
                        organization => 'My Company Test',
                        email        => 'foo@my.company.com',
                        street1      => 'Techway',
                        street2      => '',
                        city         => 'Provo',
                        province     => 'UT',
                        postal_code  => '84606',
                        country      => 'US',
                        phone        => '+1.8017659400',
                        fax          => '',
                 },

            The YAR API only allows for one contact in each of the
            registrant, admin, billing, and tech categories.

        Specifying nameservers
            You may pass in 2 to 13 nameservers to use for lookups on the
            newly registered domain. If no nameservers are passed, the new
            domain will default to use the nameservers listed in the
            domain->agent_nameservers method call.

        The domain.register method will return the following pieces of
        information:

            domain_id                The id of the created domain
            contact_id_admin         The admin contact handle id
            contact_id_registrant    The registrant contact handle id
            contact_id_billing       The billing contact handle id
            contact_id_tech          The tech contact handle id
            user_id                  The id of the new user
            offer_id                 The id of the offer used
            invoice_id               The id of the new invoice
            order_id                 The id of the new order
            date_created_registry    The official creation date at the registry
            date_expiration_registry The official expiration date at the registry

    registrar_info
        Runs domain.registrar_info. Used for getting information about a
        domain directly from the registry for that domain. Returns an error
        if the domain is not currently installed on the Registry.

    renew
        Runs domain.renew. Used for renewing existing domains.

        Similar to the domain.register command, except that user_id,
        contact_ids, and nameservers do not need to be passed. The same
        options are available for passsing in either duration, offer_id, or
        order_id.

    search
        Runs domain.search. Used for searching for domains.

            my $rows = $yar->domain->search({
                 select => ['user_id', 'count(*)'],
                 where => [{field => "user_id", op => '!=', value => 2},
                           {junction => 'OR'},
                           {field => "user_id", op => '!=', value => 3},
                           {where => [{field => "user_id", op => '!=', value => 4}]},
                          ],
                 group_by => ['user_id'],
                 order_by => ['count(*)', 'user_id'],
            })->data->{'rows'};

    search_all
        Same as search - but automatically assembles rows from queries that
        return on multiple pages.

        It is not required, but you should pass a unique_key to base the
        search on. Without this, the algorithm may exclude domains in the
        results if the number of records doesn't remain constant. Using a
        unique key will make sure that you always get the full set of rows.
        The unique key should be one of the columns being selected.

            my $rows = $yar->domain->search_all({unique_key => 'domain'})->data->{'rows'};

    transfer_in_request
        Runs domain.transfer_in_request. Used for initiating a transfer.
        When called, the passed information is verified, the Admin contact
        is looked up, and an email is sent to the Admin contact email
        address to inform them of the transfer request.

            my $resp = $yar->domain->transfer_in_request({
                user_id => $user_id,
                domain  => $domain,
            });

            # $resp->data = {
            #     transfer_in_id => $unique_transfer_in_id,
            #     admin_email    => $admins_email,
            #     user_id        => $user_id,
            #     order_id       => $order_id,
            #     invoice_id     => $invoice_id,
            #     contact_id_registrant => $reg_id,
            #     contact_id_admin      => $admin_id,
            #     contact_id_billing    => $bill_id,
            #     contact_id_tech       => $tech_id,
            # };

        The passed user_id is used to associate the transfer to a user. If
        the transfer belongs to a new user, the new user information can be
        passed in a "user" hash. The newly created user_id is returned in
        the output. See the user->create method for possible options.

            my $resp = $yar->domain->transfer_in_request({
                user   => {
                    username   => $username, # username is optional
                    password   => '123qwe',  # password may be MD5'ed
                    email      => 'foo@my.company.com',
                    phone      => '+1.8017659400',
                    first_name => 'George',
                    last_name  => 'Jones',
                },
                domain => $domain,
            });

        Contact ids or contact info that will be used for the domain once
        the transfer has taken place can be passed in during this phase. If
        the domain is a com or net domain you are required to pass in the
        contact information. On all other domain types the YAR service will
        attempt to get the information from the registries (you may still
        pass the new contacts if you like). You can pass in information for
        the registrant, admin, billing, and tech contacts in the same ways
        listed in the domain->register method.

        Sample transfer_in_request:

            my $resp = $yar->domain->transfer_in_request({
                domain     => $domain,
                user_id    => $user_id,
                registrant => {
                    first_name   => 'George',
                    last_name    => 'Jones',
                    organization => 'My Company Test',
                    email        => 'foo@my.company.com',
                    street1      => 'Techway',
                    city         => 'Provo',
                    province     => 'UT',
                    postal_code  => '84606',
                    country      => 'US',
                    phone        => '+1.8017659400',
                },
                admin => {contact_id => 'registrant'},
                contact_id_billing => 'registrant',
                contact_id_tech    => 'FAST-12312',
            });

        If the registrar would like to handle sending the admin email
        themselves, the "skip_send_email" flag can be passed. In this case
        the transfer_in verification_id will be returned in the data. This
        verification_id is normally sent to the admin email and must be
        passed to the domain_transfer_in_approve method.

            my $resp = $yar->domain->transfer_in_request({
                domain          => $domain,
                user_id         => $user_id,
                skip_send_email => 1,
            });

            # $resp->data = {
            #     transfer_in_id  => $unique_transfer_in_id,
            #     verification_id => $verification_id,
            # };

        If the EPP auth_code is passed in it will be verified before sending
        the admin email. The epp_auth_code is required on org and info
        domain during this phase. If not passed here for all other domains
        domains it will be required during the domain_transfer_in_approve
        command.

            my $resp = $yar->domain->transfer_in_request({
                domain        => $domain,
                user_id       => $user_id,
                epp_auth_code => $epp_auth_code,
            });

        If the EPP auth_code is invalid, the type of error will be
        transfer_blocked and the invalid_epp_auth_code flag will be set.

            # $resp->data->{'flags'} = {
            #     invalid_epp_auth_code => $true_int_flag
            # };

        If the domain is currently locked from transfer the domain_locked
        flag will be set.

            # $resp->data->{'flags'} = {
            #     domain_locked => $true_int_flag
            # };

        If you would like to test the data without actually causing any
        transfer to occur, you can pass the validate_only flag.

            my $resp = $yar->domain->transfer_in_request({
                domain        => $domain,
                user_id       => $user_id,
                epp_auth_code => $epp_auth_code,
                validate_only => 1,
            });

            # $resp->data = {
            #     no_operation_taken => 1,
            #     validated          => 1,
            # };

        You normally cannot transfer a domain you already own to yourself.
        If you are testing the transfer process you can pass the
        "test_local_transfer" flag. No registry operations will take place
        but the normal transfer process will be followed.

    transfer_in_approve
        Runs domain.transfer_in_approve. Used for verifying the admin was
        notified of the transfer request, and then initiates the transfer at
        the registry. See the domain_transfer_in_request for information on
        how the verification id is sent to the admin.

            my $resp = $yar->domain->transfer_in_approve({
                domain          => $domain,
                verification_id => $id_sent_to_admin,
            });

            # $resp->data = {};

        If the EPP auth_code was not previously sent in the
        domain_transfer_in_request method, it must be supplied at this
        point.

            my $resp = $yar->domain->transfer_in_approve({
                domain          => $domain,
                verification_id => $id_sent_to_admin,
                epp_auth_code   => $epp_auth_code,
            });

        If you would like to test the data before actually initiating the
        transfer you may pass the validate_only flag.

            my $resp = $yar->domain->transfer_in_approve({
                domain          => $domain,
                verification_id => $id_sent_to_admin,
                epp_auth_code   => $epp_auth_code,
                validate_only   => 1,
            });

            # $resp->data = {
            #     no_operation_taken => 1,
            #     validated          => 1,
            # };

    transfer_in_finalize
        Runs domain.transfer_in_finalize. Used by the YAR service to finish
        transfering domains into the service. Takes a domain and an
        operation. The operation should be one of approve, reject, or
        cancel. An approve operation will only work if the domain has been
        successfully transfered at the registry. A reject operation will
        only work if the domain is not currently in a pending state. (Both
        the approve and reject are to be used to finalize the transfer of a
        domain that is already approved or rejected. Generally they are only
        used to hasten the transfer process - the registrar will run the
        command in time). The cancel operation can be used to stop a
        transfer that has previously been requested with transfer_in_request
        and approved with transfer_in_approve.

            my $resp = $yar->domain->transfer_in_finalize({
                domain    => $domain,
                operation => 'approve',
            });

            # $resp->data = {};

    transfer_out_approve
        Note that there is no transfer_out_request method. Transfer out may
        only be requested by another registrar. The YAR service will receive
        notification of the tranfer out request and will take appropriate
        action.

        Runs domain.transfer_out_approve. If an out going transfer request
        notification is received, the Registrant and Admin contacts will be
        sent an email informing them that the transfer is about to take
        place and will take place if action is not taken within a few days.
        The email also contains a verification id and link that can used to
        hasten the transfer process. It also gives them a link that can be
        used to reject the transfer. These links are configurable by the
        reseller.

        To approve the transfer either of the following will do:

            my $resp = $yar->domain->transfer_out_approve({
                domain          => $domain,
            });

            # $resp->data = {};

            # OR

            my $resp = $yar->domain->transfer_out_approve({
                domain          => $domain,
                verification_id => $id_sent_to_admin,
            });

            # $resp->data = {};

        The verification_id is not required - but is suggested so that the
        registrant and admin can be identified properly. Both the admin and
        the registrant will receive the same verification id.

        If you would like to verify the information without actually
        accepting the transfer, you can pass the validate_only flag.

            my $resp = $yar->domain->transfer_out_approve({
                domain          => $domain,
                verification_id => $id_sent_to_admin,
                validate_only   => 1,
            });

            # $resp->data = {
            #     no_operation_taken => 1,
            #     validated          => 1,
            # };

    transfer_out_reject
        Runs domain.transfer_out_approve. All passed arguments are the same
        as for domain_transfer_out_approve. This command is used for
        rejecting a requested transfer.

    transfer_status
        Check status on a previously requested transfer request.

            my $resp = $yar->domain->transfer_status({
                domain=> $domain,
            });

    update
        Runs domain.update. Used for updating nameservers, contacts, and
        locking on domains.

            my $resp = $yar->domain->update({
                domain      => $domain,
                domain_lock => 0,
            });

    whois
        Runs domain.whois. Used for getting all whois information for a
        domain that is registered through the YAR service. Returns an error
        if the domain is not installed on the YAR service.

            my $resp = $yar->domain->update({
                domain      => $domain,
            });

  INVOICE METHODS
    create
        Runs invoice.create. Can create a new invoice for a user. Generally
        you will not call this method as the domain.register,
        domain.transfer, and domain.renew methods can create the orders for
        you automatically. See the YAR API documetation.

    delete
        Runs invoice.delete. Deletes an invoice that has not been completed
        and that has 0 or more orders that have not been completed.
        Generally only used during testing.

    info
        Runs invoice.info. Returns information associated with the invoice.

            my $resp = $yar->invoice->info({invoice_id => $invoice_id});

    search
        Runs invoice.search. Allows for searching through invoices.

            my $rows = $yar->invoice->search({
                 select => ['invoice_id', 'date_completed'],
                 where  => [{
                     field => "date_completed",
                     op => '>',
                     value => '2007-03-01',
                 }],
             })->data->{'rows'};

    search_all
        Same as search - but automatically assembles rows from queries that
        return on multiple pages.

  OFFER METHODS
    info
        Runs offer.info. Returns information associated with the offer.

            my $resp = $yar->offer->info({offer_id => $offer_id});

    search
        Runs offer.search. Allows for searching through offers.

            my $rows = $yar->offer->search({
                select => [qw(duration offer_id agent_price)],
                where  => [
                    {field => 'tld', value => 'com'},
                    {field => 'service_code', value => 'domain_reg'}
                ],
            })->data->{'rows'};

    search_all
        Same as search - but automatically assembles rows from queries that
        return on multiple pages.

  ORDER METHODS
    create
        Runs order.create. Can create a new order for a user. Generally you
        will not call this method as the domain.register, domain.transfer,
        and domain.renew methods can create the orders for you
        automatically. See the YAR API documetation.

    delete
        Runs order.delete. Deletes an order that has not been completed and
        that does not have a domain or other service associated with it.
        Generally only used during testing.

    info
        Runs order.info. Returns information associated with the order.

            my $resp = $yar->order->info({order_id => $order_id});

    search
        Runs order.search. Allows for searching through orders.

            my $rows = $yar->order->search({
                 select => ['order_id', 'date_completed'],
                 where  => [{
                     field => "date_completed",
                     op => '>',
                     value => '2007-03-01',
                 }],
                 rows_per_page => 10,
                 order_by => ['date_completed'],
             })->data->{'rows'};

    search_all
        Same as search - but automatically assembles rows from queries that
        return on multiple pages.

  USER METHODS
    create
        Runs user.create. Used to install a new user.

            $yar->user->create($args);
            $yar->user_create($args);

            my $resp = $yar->user->create({
                username   => $username, # username is optional
                password   => '123qwe',  # password may be MD5'ed
                email      => 'foo@my.company.com',
                phone      => '+1.8017659400',
                first_name => 'George',
                last_name  => 'Jones',
            });

            # $r->data = {
            #     user_id => 789553
            # };

        The username is optional but must be unique on any particular agent.

        The password may be 1 to 30 characters. It will be used to give the
        user access to manage there domains at the YAR service provider
        (depending upon the agent contract). Either the password or the md5
        of the password may be passed.

        The phone number must be in the '+1.8885551234' format. You can use
        the util->phone method to clean up the phone number.

    delete
        Runs user.delete. Used to delete a user.

            $resp = $yar->user_delete({
                username => $username,
            });

            # $resp->data = {
            #     n_rows => 1,
            # };

        If the user is already deleted, a true response will be returned but
        n_rows will be 0.

        Either the username or the user_id may be used to select the user to
        delete.

        A user cannot be deleted if it has associated domains, contacts,
        invoices, orders, or domain revenue history.

    info
        Runs user.info. Used to return the information of a user. May pass
        either the username or the user_id.

            $resp = $yar->user_info({
                username => $username, # can pass user_id instead
            });

            # $resp->data = {
            #     agent_id     => 145654,
            #     date_created => "2006-09-13 20:53:51",
            #     date_created_epoch => "1158180831",
            #     email        => "foo\@fastdomain.com",
            #     first_name   => "George",
            #     last_name    => "Jones",
            #     password     => "123qwe",
            #     phone        => "+1.8017659400",
            #     user_id      => 789459,
            #     username     => "01_user.t"
            # };

        If a user does not exist, then the response $resp will be defined
        but false.

            $resp = $yar->user_info({
                user_id => 1, # user_id 1 doesn't exist
            });

            # $resp is false
            # $resp->is_fault is true
            # $resp->code eq 'not_found'

    search
        Runs user.search. Used for searching for users.

            my $rows = $yar->user->search({
                 select => ['user_id', 'count(*)'],
                 where  => [{field => "username", op => 'IS NULL'},
                            {field => "password", op => '=', value => ''},
                          ],
                 group_by => ['user_id'],
                 order_by => ['count(*)', 'user_id'],
            })->data->{'rows'};

        See the full YAR API documentation for the list of possible search
        capabilities.

    search_all
        Same as search - but automatically assembles rows from queries that
        return on multiple pages.

    update
        Runs user.update. Used to update the user information.

            $resp = $yar->user_update({
                username => $username,
                password => 'ewq321',
                email    => 'bar@my.company.com',
            });

            # $resp->data = {
            #     n_rows => 1,
            # };

        If the data was already updated, a true response will be returned
        but n_rows will be 0.

        Either the username or the user_id may be used to select the user to
        update. Any of the fields submitted during the user_create may be
        updated.

        The username can be updated by submitting both the user_id as well
        as the new username.

            $resp = $yar->user_update({
                user_id  => $user_id,
                username => $new_username,
            });

            # $resp->data = {
            #     n_rows => 1,
            # };

  UTIL METHODS
    balance
        Runs util.balance. Can be used to get the current balance for the
        registrar.

            $yar->util->balance;
            $yar->util_balance;
            $yar->balance; # special direct method

            my $balance = $yar->util->balance->data->{'balance'};

    noop
        Runs util.noop. Used as a non-operation command to test for
        connectivity.

            $yar->util->noop;
            $yar->util_noop;
            $yar->noop; # special direct method

            my $resp = $yar->noop;

            # $resp will be true but $resp->data will be empty

        Noop also has a basic echo feature that will return an arrayref of
        passed argument keys and values. This can be used for testing data
        encoding.

    phone
        Runs util.phone. Can be used to pre-validate and cleanup phone
        numbers.

            $yar->util->phone($args);
            $yar->util_phone($args);

            my $resp = $yar->util->phone({country => 'USA', phone => '(801) 765-9400'});

            # $resp->data contains {country => 'US', phone => '+1.8017659400'}

        An optional flag "allow_anything" may be passed which will return
        the phone number in a state that will pass later validation - even
        if it doesn't appear to be a valid number.

    server_time
        Returns the current time on the YAR server. The time returned is in
        the GMT timezone.

            $yar->util->server_time;
            $yar->util_server_time;

            my $time = $yar->util->server_time->data->{'server_time'};

  WHOIS METHODS
    info
        Parses the whois output into various useful fields.

            my $resp = $yar->whois->info({domain => $domain});

            # $resp->data = {
            #   domain     => $domain,
            #   creation   => [date],
            #   expiration => [date],
            #   obtained   => [date],
            #   privacy    => { 0 | 1 },
            #   adminemail    => ...,
            #   adminname     => ...,
            #   adminstreet   => ...,
            #   admincity     => ...,
            #   adminprovince => ...,
            #   adminpostal   => ...,
            #   admincountry  => ...,
            #   adminphone    => ...,
            #   adminfax      => ...,
            # }

    raw If you just need the raw whois string or wish to parse the output
        yourself instead of using the whois_info method, use this to return
        the entire string. Note: This informtaion is cached on the server in
        order to help reduce whois query loads for external registrars.

            my $resp = $yar->whois_raw({
                domain          => $domain,
            });

            # $resp->data = {
            #   domain     => $domain,
            #   obtained   => [date],
            #   raw        => $whois_string,
            # }

AUTHOR
    Paul Seamons <paul@fastdomain.com>

LICENSE
    This module is licensed under the same terms as Perl itself.