From 4a1aaf32fde2658905f84ffb76708d7ffe53480f Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Wed, 6 Jul 2011 19:21:56 -0500 Subject: initial implementation --- lib/smartmatch.pm | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) (limited to 'lib') diff --git a/lib/smartmatch.pm b/lib/smartmatch.pm index e69de29..f464d95 100644 --- a/lib/smartmatch.pm +++ b/lib/smartmatch.pm @@ -0,0 +1,38 @@ +package smartmatch; +use strict; +use warnings; +# ABSTRACT: pluggable smart matching backends + +use parent 'DynaLoader'; +use B::Hooks::OP::Check; +use B::Hooks::EndOfScope; + +sub dl_load_flags { 0x01 } + +__PACKAGE__->bootstrap( + # we need to be careful not to touch $VERSION at compile time, otherwise + # DynaLoader will assume it's set and check against it, which will cause + # fail when being run in the checkout without dzil having set the actual + # $VERSION + exists $smartmatch::{VERSION} + ? ${ $smartmatch::{VERSION} } : (), +); + +sub import { + my $package = shift; + my ($cb) = @_; + $cb = $cb->can('match') unless ref($cb); + + $^H ||= 0x020000; # HINT_LOCALIZE_HH + + $package->unimport; + $^H{'smartmatch_cb'} = smartmatch::register($cb); + on_scope_end { $package->unimport }; +} + +sub unimport { + return unless exists $^H{'smartmatch_cb'}; + smartmatch::unregister(delete $^H{'smartmatch_cb'}); +} + +1; -- cgit v1.2.3-54-g00ecf