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 DBIx::Class::InflateColumn::URI;

=head1 NAME

DBIx::Class::InflateColumn::URI - Auto-create URI objects from columns

=head1 SYNOPSIS

Load this component and then declare one or more columns as URI columns.

  package Resources;
  __PACKAGE__->load_components(qw/InflateColumn::URI Core/);
  __PACKAGE__->add_columns(
      url => {
          datatype => 'varchar',
          size => 255,
          is_nullable => 1,
          default_uri_scheme => 'http',
          is_uri => 1,
      },
  );

Then you can treat the specified column as an URI object.

  print 'stringified URI: ', $resource->url, "\n";
  print 'scheme: ', $resource->url->scheme, "\n";
  print 'domain: ', $resource->url->host, "\n";
  print 'path:   ', $resource->url->path, "\n";

=head1 DESCRIPTION

This module inflates/deflates designated columns into URI objects.

=cut

use strict;
use warnings;
use URI;

our $VERSION = '0.01002';

=head2 Methods

=over 4

=item default_uri_scheme

Gets/sets the default scheme to use when no scheme is specified in the URI.

  __PACKAGE__->default_uri_scheme('http');

You can also set this on a per column basis, as shown in the L</SYNOPSIS>.

=cut

BEGIN {
    use base qw/DBIx::Class Class::Accessor::Grouped/;
    __PACKAGE__->mk_group_accessors('inherited', qw/
        default_uri_scheme
    /);
};

=item register_column

Chains with the "register_column" in DBIx::Class::Row method, and sets up
currency columns appropriately. This would not normally be directly called by
end users.

=cut

sub register_column {
    my ($self, $column, $info, @rest) = @_;
    $self->next::method($column, $info, @rest);

    return unless defined $info->{'is_uri'};

    my $default_uri_scheme = $info->{'default_uri_scheme'} || $self->default_uri_scheme || '';

    $self->inflate_column(
        $column => {
            inflate => sub {
                my ($value, $obj) = @_;
                if ($default_uri_scheme and $value !~ m|://|) {
                    return URI->new($default_uri_scheme . '://' . $value);
                }
                return URI->new($value, $default_uri_scheme);
            },
            deflate => sub {
                return shift->as_string;
            },
        }
    );
};

=back

=cut

1;
__END__

=head1 SEE ALSO

L<URI>,
L<DBIx::Class::InflateColumn>,
L<DBIx::Class>.

=head1 AUTHOR

Nathan Gray E<lt>kolibrie@cpan.orgE<gt>

=head1 COPYRIGHT AND LICENSE

Copyright (C) 2007 by Nathan Gray

This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself, either Perl version 5.8.8 or,
at your option, any later version of Perl 5 you may have available.

=cut