NAME

Data::Section::Pluggable - Read structured data from __DATA__

VERSION

version 0.07

SYNOPSIS

use Data::Section::Pluggable;

my $dsp = Data::Section::Pluggable->new
                                  ->add_plugin('trim')
                                  ->add_plugin('json');

# prints "Welcome to Perl" without prefix
# or trailing white space.
say $dsp->get_data_section('hello.txt');

# also prints "Welcome to Perl"
say $dsp->get_data_section('hello.json')->{message};

# prints "This is base64 encoded.\n"
say $dsp->get_data_section('hello.bin');

__DATA__

@@ hello.txt
  Welcome to Perl


@@ hello.json
{"message":"Welcome to Perl"}

@@ hello.bin (base64)
VGhpcyBpcyBiYXNlNjQgZW5jb2RlZC4K

DESCRIPTION

Data::Section::Simple is a module to extract data from __DATA__ section of Perl source file. This module started out as a fork of Data::Section::Simple (itself based on Mojo::Loader), and includes some of its tests to ensure compatibility, but it also includes features not available in either of those modules.

This module caches the result of reading the __DATA__ section in the object if you use the OO interface. It doesn't do any caching of the processing required of "formats" (see below).

This module also supports base64 encoding using the same mechanism as Mojo::Loader, which is helpful for putting binary sections in __DATA__.

As mentioned, this module aims to be and is largely a drop in replacement for Data::Section::Simple with some extra features. Here are the known ways in which it is not compatible:

  • Because Data::Section::Simple does not support base64 encoded data, these data sections would include the (base64) in the filename instead of decoding the content.

  • When a section is not found Data::Section::Simple return the empty list from get_data_section, where as this module returns undef, in order to keep the return value more consistent.

CONSTRUCTOR

my $dsp = Data::Section::Pluggable->new($package);
my $dsp = Data::Section::Pluggable->new(\%attributes);
my $dsp = Data::Section::Pluggable->new(%attributes);

ATTRIBUTES

package

The name of the package to read from __DATA__. If not specified, then the current package will be used.

prefer_filesystem

If provided, this is a directory containing files from where content will be preferred over what is in the __DATA__ section, if available. This file still must still exist in the __DATA__ section to be found. This can be useful to do local testing with files on the filesystem, but release a script or test a just one combined file.

METHODS

get_data_section

my $hash = get_data_section;
my $data = get_data_section $name;
my $hash = $dsp->get_data_section;
my $data = $dsp->get_data_section($name);

Gets data from __DATA_. This can be called either as a function (which is optionally exported from this module), or as an object method. Creating an instance of Data::Section::Pluggable allows you to use packages other than the default or use plugins.

add_format

$dsp->add_format( $ext, sub ($dsp, $content) { return ... } );

Adds a content processor to the given filename extension. The extension should be a filename extension without the ., for example txt or json.

The callback takes the Data::Section::Pluggable instance as its first argument and the content to be processed as the second. This callback should return the processed content as a scalar.

You can chain multiple content processors to the same filename extension, and they will be called in the order that they were added.

add_plugin

$dsp->add_plugin( $name, %args );

Applies the plugin with $name. If the plugin supports instance mode (that is: it has a constructor named new), then %args will be passed to the constructor. For included plugins see "CORE PLUGINS". To write your own see "PLUGIN ROLES".

extract

$dsp->extract($dir);
$dsp->extract;

Extract all files in Data section to the given $dir, or if not provided the current directory.

CORE PLUGINS

json

Automatically decode json into Perl data structures. See Data::Section::Pluggable::Plugin::Json.

trim

Automatically trim leading and trailing white space. See Data::Section::Pluggable::Plugin::Trim.

PLUGIN ROLES

ContentProcessorPlugin

Used for adding content processors for specific formats. This is essentially a way to wrap the add_format method as a module. See Data::Section::Pluggable::Role::ContentProcessorPlugin.

SEE ALSO

These are some alternative modules that do a similar thing, each with their own feature set and limitations.

Data::Section
Data::Section::Simple
Data::Section::Writer
Mojo::Loader

AUTHOR

Graham Ollis <plicease@cpan.org>

COPYRIGHT AND LICENSE

This software is copyright (c) 2024 by Graham Ollis.

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