package Data::Model::Schema::Inflate;
use strict;
use warnings;
use Carp ();
$Carp::Internal{(__PACKAGE__)}++;
sub import {
my $class = shift;
my $caller = caller;
no strict 'refs';
*{"$caller\::inflate_type"} = \&inflate_type;
}
my %INFLATE = (
inflate => {
URI => sub { URI->new($_[0]) },
Hex => sub { unpack("H*", $_[0]) },
},
deflate => {
URI => sub { $_[0]->as_string },
Hex => sub { pack("H*", $_[0]) },
},
);
sub get_inflate {
my($class, $name) = @_;
$INFLATE{inflate}->{$name};
}
sub get_deflate {
my($class, $name) = @_;
$INFLATE{deflate}->{$name};
}
sub inflate_type {
my($name, $hash) = @_;
my $caller = caller;
for my $type (qw/ inflate deflate /) {
if (ref($hash->{$type}) eq 'CODE') {
Carp::croak "The inflate_type '$name' has already been created, cannot be created again in $caller"
if $INFLATE{$type}->{$name};
$INFLATE{$type}->{$name} = $hash->{$type};
}
}
}
1;