Most programmers who use Perl's object-oriented features construct their
objects by blessing a hash. But, in doing so, they undermine the
robustness of the OO approach. Hash-based objects are unencapsulated:
their entries are open for the world to access and modify.
Objects without effective encapsulation are vulnerable. Instead of
politely respecting their public interface, some clever client coder
inevitably will realize that it's marginally faster to interact directly
with the underlying implementation, pulling out attribute values
directly from the hash of an object.
This module was written because I stumbled on some serious issues of Readonly
that aren't easily fixable without breaking backwards compatibility in subtle
ways. In particular Readonly's use of ties is a source of subtle bugs and bad
performance. Instead, this module uses the builtin readonly feature of perl,
making access to the variables just as fast as any normal variable without
the weird side-effects of ties. Readonly can do the same for scalars when
Readonly::XS is installed, but chooses not to do so in the most common case.
File::Find::Object does same job as File::Find but works like an
object and with an iterator. As File::Find is not object oriented, one
cannot perform multiple searches in the same application. The second
problem of File::Find is its file processing: after starting its main
loop, one cannot easily wait for another event an so get the next
result.
With File::Find::Object you can get the next file by calling the
next() function, but setting a callback is still possible.
LV makes lvalue subroutines easy and practical to use. It's inspired by the
lvalue module which is sadly problematic because of the existence of another
module on CPAN called Lvalue. (They can get confused on file-systems that have
case-insensitive file names.)
LV comes with three different implementations, based on Variable::Magic,
Sentinel and tie; it will choose and use the best available one. You can force
LV to pick a particular implementation using:
$ENV{PERL_LV_IMPLEMENTATION} = 'Magic'; # or 'Sentinel' or 'Tie'
The tie implementation is the slowest, but will work on Perl 5.6 with only core
modules.
Lexical::Persistence does a few things, all related. Note that all the
behaviors listed here are the defaults. Subclasses can override nearly
every aspect of Lexical::Persistence's behavior.
Lexical::Persistence lets your code access persistent data through lexical
variables. This example prints "some value" because the value of $x
persists in the $lp object between setter() and getter().
use Lexical::Persistence;
my $lp = Lexical::Persistence->new();
$lp->call(\&setter);
$lp->call(\&getter);
sub setter { my $x = "some value" }
sub getter { print my $x, "\n" }
Sub::Exporter is an incredibly powerful module, but with that power comes great
responsibility, er- as well as some runtime penalties. This module is a
Sub::Exporter wrapper that will let your users just use Exporter if all they are
doing is picking exports, but use Sub::Exporter if your users try to use
Sub::Exporter's more advanced features features, like renaming exports, if they
try to use them.
Note that this module will export @EXPORT and @EXPORT_OK package variables for
Exporter to work. Additionally, if your package uses advanced Sub::Exporter
features like currying, this module will only ever use Sub::Exporter, so you
might as well use it directly.
The pip ("Perl Installation Program") console application is used
to install Perl distributions in a wide variety of formats, both
from CPAN and from external third-party locations, while supporting
module dependencies that go across the boundary from third-party
to CPAN.
Using pip you can install CPAN modules, arbitrary tarballs from
both the local file-system or across the internet from arbitrary
URIs.
You can use pip to ensure that specific versions of CPAN modules
are installed instead of the most current version.
Ponscripter is an interpreter for visual-novel-type games, derived from
the NScripter design but modified significantly to improve support for
Western languages (at the cost of diminished support for Japanese).
Ponscripter is a fork of ONScripter-En that drops any attempt to remain
in synch with the upstream source code, and instead concentrates on
providing the best possible support for Western languages. It is no
longer fully NScripter-compatible, but remains an easy target to port
NScripter games to when localising them.
This fork takes advantage of SDL2 and improves Steam integration.
Grab is a python web scraping framework. Grab provides tons of helpful methods
to scrape web sites and to process the scraped content:
* Automatic cookies (session) support
* HTTP and SOCKS proxy with and without authorization
* Keep-Alive support
* IDN support
* Tools to work with web forms
* Easy multipart file uploading
* Flexible customization of HTTP requests
* Automatic charset detection
* Powerful API of extracting info from HTML documents with XPATH queries
* Asynchronous API to make thousands of simultaneous queries. This part of
library called Spider and it is too big to even list its features in this
README.
* Python 3 ready
The Voidspace Pythonutils package is a simple way of installing the Voidspace
collection of modules. These are currently:
ConfigObj 4.4.0 - Easy config file reading/writing
validate 0.2.3 - Validation and type conversion system
StandOut 3.0.0 - Simple logging and output control object
pathutils 0.2.5 - For working with paths and files
cgiutils 0.3.5 - CGI helpers
urlpath 0.1.0 - Functions for handling URLs
odict 0.2.1 - Ordered Dictionary Class
Several of the Voidspace Projects depend on these modules. They are also useful
in their own right of course. They are primarily general utility modules that
simplify common programming tasks in Python.