package Crypt::Perl::ASN1;

#Wrappers around basic methods to get exceptions thrown on errors.

use strict;
use warnings;

use parent 'Convert::ASN1';

use Crypt::Perl::BigInt ();
use Crypt::Perl::X ();

sub new {
    my ($class, @opts) = @_;

    return $class->SUPER::new(
        encode => { bigint => 'Crypt::Perl::BigInt' },
        decode => { bigint => 'Crypt::Perl::BigInt' },
        @opts,
    );
}

sub prepare {
    my ( $self, $asn1_r ) = ( $_[0], \$_[1] );

    my $ret = $self->SUPER::prepare($$asn1_r);

    if ( !defined $ret ) {
        die Crypt::Perl::X::create('ASN1::Prepare', $$asn1_r, $self->error());
    }

    return $ret;
}

sub find {
    my ( $self, $macro ) = @_;

    return $self->SUPER::find($macro) || do {
        die Crypt::Perl::X::create('ASN1::Find', $macro, $self->error());
    };
}

sub encode {
    my ($self) = shift;

    return $self->SUPER::encode(@_) || do {
        die Crypt::Perl::X::create('ASN1::Encode', \@_, $self->error());
    };
}

sub decode {
    my ($self) = shift;

    return $self->SUPER::decode($_[0]) || do {
        die Crypt::Perl::X::create('ASN1::Decode', $_[0], $self->error());
    };
}

my $_asn1_null;

sub NULL {
    return $_asn1_null ||= Crypt::Perl::ASN1->new()->prepare('n NULL')->encode( { n => 0 } );
}

1;