The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;

use Test::More 'tests' => 6;

package My::Class; {
    use Object::InsideOut;

    my @data :Field('Get' => 'data');
    my @info :Field('Get' => 'info');
    my @misc :Field('Get' => 'misc');

    my %init_args :InitArgs = (
        'DATA' => {
            'Preproc' => \&preproc,
            'Field'   => \@data,
        },
        'INFO' => {
            'Preproc' => \&preproc,
            'Field'   => \@info,
            'Default' => 'deleted',
        },
        'MISC' => {
            'Preproc' => \&preproc,
            'Field'   => \@misc,
        },
    );

    sub preproc
    {
        my ($class, $param, $spec, $obj, $value) = @_;

        Test::More::is($class, __PACKAGE__, 'Correct class');

        # Delete param and let specified default be set
        if (exists($$spec{'Default'})) {
            return;
        }

        # Override the specified value
        if (defined($value)) {
            return ('overridden');
        }

        # Provide a default
        return ('default');
    }
};

package main;

MAIN:
{
    my $obj = My::Class->new('INFO' => 'information',
                             'MISC' => 'miscellaneous');

    is($obj->data(), 'default'    => 'Preprocessing - default');
    is($obj->info(), 'deleted'    => 'Preprocessing - deleted');
    is($obj->misc(), 'overridden' => 'Preprocessing - overridden');
}

exit(0);

# EOF