The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Data::Petitcom::Resource;

use strict;
use warnings;

use parent qw{ Exporter };
our @EXPORT = qw{ get_resource };

use Carp ();
use Module::Load ();

sub get_resource {
    my %opts     = @_;
    my $resource = delete $opts{resource} || 'PRG';
    my $pkg_resource = join '::', __PACKAGE__, uc($resource);
    Module::Load::load $pkg_resource;
    my $obj_resource = $pkg_resource->new( resource => $resource, %opts );
    Carp::croak "initialize failed: $!"
        unless ( $obj_resource->isa(__PACKAGE__) );
    return $obj_resource;
}

my %defaults = ( data => undef );

sub new {
    my $class = ref $_[0] ? ref shift : shift;
    my $self = bless {@_}, $class;
    $self->init() if ( $self->can('init') );
    return $self;
}

sub init {
    my $self = shift;
    for ( keys %defaults ) {
        my $value = $self->{$_} || $defaults{$_};
        ( $self->can($_) ) ? $self->$_($value) : ( $self->{$_} = $value );
    }
    return $self;
}

sub data {
    my $self = shift;
    $self->{data} = shift if (@_);
    return $self->{data};
}

sub save { die "override save" }
sub load { die "override load" }

1;