
package Devel::Hook;

use 5.006;
use strict;
use warnings;

our $VERSION = '0.011';

require XSLoader;
XSLoader::load( 'Devel::Hook', $Devel::Hook::VERSION );


sub unshift_BEGIN_hook {
    shift;
    _check( 'BEGIN', @_ );
    unshift @{ _get_begin_array() }, @_;
}

sub push_BEGIN_hook {
    shift;
    _check( 'BEGIN', @_ );
    push @{ _get_begin_array() }, @_;
}


sub unshift_UNITCHECK_hook {
    shift;
    _check( 'UNITCHECK', @_ );
    unshift @{ _get_unitcheck_array() }, @_;
}

sub push_UNITCHECK_hook {
    shift;
    _check( 'UNITCHECK', @_ );
    push @{ _get_unitcheck_array() }, @_;
}


sub unshift_CHECK_hook {
    shift;
    _check( 'CHECK', @_ );
    unshift @{ _get_check_array() }, @_;
}

sub push_CHECK_hook {
    shift;
    _check( 'CHECK', @_ );
    push @{ _get_check_array() }, @_;
}


sub unshift_INIT_hook {
    shift;
    _check( 'INIT', @_ );
    unshift @{ _get_init_array() }, @_;
}

sub push_INIT_hook {
    shift;
    _check( 'INIT', @_ );
    push @{ _get_init_array() }, @_;
}


sub unshift_END_hook {
    shift;
    _check( 'END', @_ );
    unshift @{ _get_end_array() }, @_;
}

sub push_END_hook {
    shift;
    _check( 'END', @_ );
    push @{ _get_end_array() }, @_;
}


my $has_support_for = _get_supported_types();
sub _has_support_for {
    shift;
    my $BLOCK = shift;
    return $has_support_for->{$BLOCK};
}

sub _check {
    my $BLOCK = shift;
    if ( grep { !UNIVERSAL::isa($_, "CODE") } @_ ) {
        require Carp;
        Carp::croak("$BLOCK blocks must be CODE references");
    }
}


1;
