NAME
Text::Wrap::OO - an object oriented interface to Text::Wrap
VERSION
version 0.001
SYNOPSIS
use Text::Wrap::OO;
my $wrapper = Text::Wrap::OO->new(init_tab => "\t");
$wrapper->columns(70);
my $wrapped = $wrapper->wrap($text);
my $filled = $wrapper->fill($text);
DESCRIPTION
Text::Wrap::OO is an object oriented wrapper to the Text::Wrap module.
Text::Wrap is useful for formatting text, and it is customizable, but it has a drawback: The configuration options are set using global package variables. This means that if a module configures Text::Wrap, it can interfere with other modules that use Text::Wrap. Indeed, the Text::Wrap documentation itself warns against setting these variables, or if you must, to local()
ize them first. While this works, it can become cumbersome, and it still does not protect your module against other modules messing with Text::Wrap global variables.
That's where Text::Wrap::OO comes in. Text::Wrap::OO provides an object oriented interface to Text::Wrap. The Text::Wrap global variables are automatically localized, so you need not worry about that. The defaults are always the same (unless you use the inherit
attribute; see ATTRIBUTES) for each new object, so you don't need to worry about other modules messing with the settings either.
A Text::Wrap::OO object has several attributes that can either be passed to the constructor (discussed later), or through accessor methods. The accessors are methods with the same name as the attributes they access, and can either be called with no arguments to get the value of the attribute, or with one argument to set the value of the attribute.
Two other types of attribute-related methods are provided as well. For an attribute ATTR, the has_ATTR
and clear_ATTR
methods are available. has_ATTR
will return true if the attribute ATTR is set, and clear_ATTR
will unset ATTR, as though it had never been set. Note that if an attribute is unset, the accessor will return the default value of the attribute, so $object->clear_ATTR
is not the same thing as $object->ATTR(undef)
.
If you have a very old version of Text::Wrap which does not support a certain configuration variable, the corresponding attribute in a Text::Wrap::OO object will warn if you try to set it, and have no effect. You can turn off these warnings by setting the warn
attribute to a false value (see the documentation for the warn
attribute).
METHODS
new
$obj = Text::Wrap::OO->new(\%params|%params);
Return a new Text::Wrap::OO object. The parameters may be passed as a hash reference, or as a hash. Parameters can be used to set the attributes as described above. Passing attributes as parameters to the constructor is exactly equivalent to using the accessors to set the attributes after creating the object.
wrap
fill
$wrapped = $obj->wrap(@text);
$filled = $obj->fill(@text);
These methods correspond to the Text::Wrap::wrap()
and Text::Wrap::fill()
subroutines respectively. @text
is passed directly to the corresponding Text::Wrap subroutine, which joins them into a string, inserting spaces between the elements if they don't already exist.
In scalar context, these methods return the wrapped text as a single string, like their Text::Wrap counterparts. However, in list context, a list of lines will be returned, split using the separator
and (if defined) separator2
attributes (these are not regexps). Note that trailing separators will cause trailing empty strings to be returned in the list. Also note that any appearance of separator
or separator2
already occurring in the input text will also be split on, not just the separators added by these methods. If you require more complicated processing, call these methods in scalar context and perform the splitting yourself.
If @text is empty, these methods will return an empty list in list context, or an empty string in scalar context.
In particular, note that push @list, $object->wrap(@text)
is not analogous to push @list, Text::Wrap::wrap('', '', @text)
. If you want to push a single item (the wrapped text) onto @list
, use push @list, scalar $object->wrap(@text)
instead.
ATTRIBUTES
inherit
If this is true (default is false), attributes that correspond to Text::Wrap variables will use the value of the corresponding Text::Wrap variables if the attributes are not set. So, for example, if in object $object
inherit
is true and columns
has never been set (or has been cleared with $object->clear_columns
), then $object->columns
will return the value of $Text::Wrap::columns
rather than the default for that attribute.
inherit
can also be an array reference, containing the names of attributes to inherit. Then, only the specified attributes will be inherited and nothing else.
This is a powerful feature, and one that should be used sparingly. One situation in which you might want to use it is if you're writing a subroutine in which you want the values of the Text::Wrap variables to be inherited. For example:
sub my_wrap {
my $wrapper = Text::Wrap::OO->new(
inherit => [qw(columns huge)],
init_tab => "\t",
tabstop => 4,
);
return $wrapper->wrap(@_);
}
sub process_text {
my ($stuff, $text) = @_;
# ... do stuff with $text ...
return my_wrap $text;
}
# Later, possibly in another module:
local $Text::Wrap::columns = 60;
local $Text::Wrap::huge = 'overflow';
my $processed_text = process_text $stuff, $text;
Note that if any of the inherited variables have invalid values (e.g., a non-numeric string for $Text::Wrap::columns
), then a warning will be emitted and the default value for the attribute will be used instead.
warn
If this is true (the default), then whenever you try to set an attribute corresponding to an unsupported Text::Wrap variable, a warning will be emitted. A warning is also emitted if you try to set the inherit
attribute to an array reference containing the name of at least one unsupported Text::Wrap variable, or if you try to set the huge
attribute to overflow
, but that's not supported.
The following two attributes are passed to the first and second arguments respectively of Text::Wrap::wrap()
and Text::Wrap::fill()
. See Text::Wrap for more info.
init_tab
String used to indent the first line. Default: empty string.
subseq_tab
String used to indent subsequent lines. Default: empty string.
The following attributes correspond to the Text::Wrap global variables of the same name. So, for example, the columns
attribute corresponds to the $Text::Wrap::columns
variable. See "OVERRIDES" in Text::Wrap for more info.
columns
The number of columns to wrap to. Must be a positive integer. Default: 76
.
break
Regexp to match word terminators. Can either be a string or a pre-compiled regexp (e.g. qr/\s/
). Default: (?=\s)\X
.
huge
Behavior when words longer than columns
are encountered. Can either be wrap
, die
, or overflow
. Default: wrap
.
unexpand
Whether to turn spaces into tabs in the returned text. Default: 1
.
tabstop
Length of tabstops. Must be a positive integer. Default: 8
.
separator
Line separator. Default: \n
.
separator2
If defined, what to add new line breaks with while preserving existing newlines. Default: undef
.
BUGS
Please report any bugs or feature requests on the bugtracker website https://rt.cpan.org/Public/Dist/Display.html?Name=Text-Wrap-OO or by email to bug-Text-Wrap-OO@rt.cpan.org.
When submitting a bug or request, please include a test-file or a patch to an existing test-file that illustrates the bug or desired feature.
SEE ALSO
ACKNOWLEDGEMENTS
Text::Wrap::OO relies on Text::Wrap for its main functionality, by David Muir Sharnoff and others. See "AUTHOR" in Text::Wrap.
AUTHOR
Asher Gordon <AsDaGo@posteo.net>
COPYRIGHT AND LICENSE
Copyright (C) 2021 Asher Gordon
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.