The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

NAME

Macro::Simple - preprocessor-like macros in Perl

SYNOPSIS

  use Macros::Simple {
    'CAN($$)' => 'blessed(%1$s) && %1$s->can(%2$s)',
  };
  
  ...;
  
  if ( CAN($obj, 'get') ) {
    ...;
  }

DESCRIPTION

This module implements something like C preprocessor macros for Perl 5.14+. It has fallbacks for Perl 5.8.3+.

I initially wrote this code back in 2014, but never put it on CPAN until now.

Methods

import( \%macros )

The primary interface for this module is the use statement as (obviously) it needs to work its magic at compile time.

Macros are defined as key-value pairs.

The keys are the names of the macros, optionally including a sub prototype. (The full feature set of Perl prototypes is not supported.) It is recommended that you use ALL_CAPS for macro names, but this is not enforced.

The values are code generators. A code generator is responsible for generating a string of Perl code that the macro will expand to.

Code generators can be coderefs which will be passed the macro's arguments as strings of Perl code, and should return the expanded Perl code as a string.

  use Macro::Simple {
    'ISA($;$)' => sub {
      my ( $obj, $class ) = @_;
      $class ||= '__PACKAGE__';
      require Scalar::Util;
      return sprintf(
        'Scalar::Util::blessed(%s) and %s->isa(%s)',
        $obj, $obj, $class,
      );
    },
  };

In many simple cases though, an sprintf-compatible string is sufficient:

  use Macro::Simple {
    'CAN($$)' => 'blessed(%1$s) && %1$s->can(%2$s)',
  };

Macro::Simple has some built-in support for using Type::Tiny types as generators too:

  use Types::Standard qw( Str );
  use Macro::Simple {
    'IS_STR($)'     => { is     => Str },
    'ASSERT_STR($)' => { assert => Str },
  };

setup_for( $package, \%macros )

The import method sets up macros for its caller. If you need to install the macros into a different package (which should currently be in the process of compiling!), then you can use Macro::Simple->setup_for( $pkg, \%macros ).

handle_generator( $generator )

Method used internally to transform a non-coderef generator into a coderef. (Is also called for coderefs, but the value is simply passed through.) Overriding this method may be useful in subclasses.

BUGS

Please report any bugs to https://github.com/tobyink/p5-macro-simple/issues.

SEE ALSO

I dunno.

AUTHOR

Toby Inkster <tobyink@cpan.org>.

COPYRIGHT AND LICENCE

This software is copyright (c) 2022 by Toby Inkster.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.

DISCLAIMER OF WARRANTIES

THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.