NAME
autobox::Bless - Guess which package a hash or hashref probably should be and blessed it
SYNOPSIS
package purple;
sub new {
my $package = shift;
bless { one => 1, two => 2, }, $package;
}
sub three {
my $self = shift;
$self->{one} + $self->{two};
}
#
package main;
use autobox::Bless;
my $purple = purple->new; # optionally comment this out
my %foo = ( one => 5, two => 17 );
print %foo->three, "\n"; # 22!
print %foo->four, "\n"; # not found, but %foo is now blessed into purple (yes, really)
DESCRIPTION
Attempts to guess which package an unblessed hash or hashref should be blessed into and bless it into that package on the fly.
Guessing is done by the fields (hash keys) present in the unblessed hash versus the fields in instances of various objects in memory. To be considered a match, the thing must find an object with all of the fields as the unblessed hash.
If that heuristic fails, as it would in the SYNOPSIS example where the <purple-
new>> line is commented out, then a less nice strategy is attempted: all loaded packages are exampled for one containing the method called.
Why would anyone want this? You have a large legacy codebase that makes heavy use of hashes for collections of assortments of data and you want to shoehorn an OO-ish API onto it. Or perhaps you just want to play with an ultra lazy style of programming.
TODO
- Mix in the
my Foo::Bar $foo
trick to give it (strong) hints - Do whatever Devel::LeakTrace does to figure out where stuff is allocated and assume that datastructures allocated in one package should be blessed into the same package
- Do better approximate matching; don't require a single instance of an object to exist with all of the fields but instead permit an aggregate of all examples to contain the various different fields
BUGS
When used with autobox::Core or similar modules that add API methods to primitive values, method names might clash.
SEE ALSO
autobox, autobox::Core, perl5i, ...
http://twitter.com/scrottie/status/10706254646
AUTHOR
Scott Walters, <scott@slowass.net>
COPYRIGHT AND LICENSE
Copyright (C) 2010 by Scott Walters
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.12.0 or, at your option, any later version of Perl 5 you may have available.