use Mojo::Base -strict;
use Tie::Hash ();
sub fqn { $_[0]->{'%%fqn'} }
sub ref { $_[0]->{'$ref'} }
sub schema { $_[0]->{"%%schema"} }
# Make it look like there is only one key in the hash
sub EXISTS {
exists $_[0]->{$_[1]} || exists $_[0]->{"%%schema"}{$_[1]};
}
sub FETCH {
exists $_[0]->{$_[1]} ? $_[0]->{$_[1]} : $_[0]->{"%%schema"}{$_[1]};
}
sub FIRSTKEY {'$ref'}
sub KEYS {'$ref'}
sub NEXTKEY {undef}
sub SCALAR {1}
sub TIEHASH {
my ($class, $schema, $ref, $fqn) = @_;
bless {'$ref' => $ref, "%%fqn" => $fqn // $ref, "%%schema" => $schema},
$class;
}
# jhthorsen: This cannot return schema() since it might cause circular references
sub TO_JSON { {'$ref' => $_[0]->ref} }
1;
=encoding utf8
=head1 NAME
JSON::Validator::Ref - JSON::Validator $ref representation
=head1 SYNOPSIS
use JSON::Validator::Ref;
my $ref = JSON::Validator::Ref->new({ref => "...", schema => {...});
or:
tie my %ref, 'JSON::Validator::Ref', $schema, $path;
=head1 DESCRIPTION
L<JSON::Validator::Ref> is a class representing a C<$ref> inside a JSON Schema.
This module SHOULD be considered internal to the L<JSON::Validator> project and
the API is subject to change.
=head1 ATTRIBUTES
=head2 fqn
$str = $ref->fqn;
The fully qualified version of L</ref>.
=head2 ref
$str = $ref->ref;
The original C<$ref> from the document.
=head2 schema
$hash_ref = $ref->schema;
A reference to the schema that the C</fqn> points to.
=head1 SEE ALSO
L<JSON::Validator>.
=cut