+my ($enc, $dec);
+# ->imports at BEGIN turns serial_*_with_object into custom ops on 5.14+
+# and eliminate method call overhead
+BEGIN {
+ eval {
+ require Sereal::Encoder;
+ require Sereal::Decoder;
+ Sereal::Encoder->import('sereal_encode_with_object');
+ Sereal::Decoder->import('sereal_decode_with_object');
+ ($enc, $dec) = (Sereal::Encoder->new, Sereal::Decoder->new);
+ };
+};
+
+if ($enc && $dec) { # should be custom ops
+ *freeze = sub ($) { sereal_encode_with_object $enc, $_[0] };
+ *thaw = sub ($) { sereal_decode_with_object $dec, $_[0], my $ret };
+} else {
+ eval { # some distros have Storable as a separate package from Perl
+ require Storable;
+ Storable->import(qw(freeze thaw));
+ $enc = 1;
+ } // warn("Storable (part of Perl) missing: $@\n");
+}