#!/usr/bin/perl

package Data::Thunk::ScalarValue;
BEGIN {
  $Data::Thunk::ScalarValue::AUTHORITY = 'cpan:NUFFIN';
}
BEGIN {
  $Data::Thunk::ScalarValue::VERSION = '0.07';
}

use strict;
use warnings;

use Carp;
use Check::ISA;

use namespace::clean;

use UNIVERSAL::ref;

our $vivify_scalar;

BEGIN {
	$vivify_scalar = sub {
		my $self = $_[0];

		# must rebless to something unoverloaded in order to get at the value
		bless $self, "Data::Thunk::NoOverload";
		my $val = $$self;
		bless $self, __PACKAGE__;

		# try to replace the container with the value wherever we found it
		local $@;
		eval { $_[0] = $val }; # might be readonly;

		$val;
	};
}

use overload (
	fallback => 1, map {
		$_ => $vivify_scalar,
	} qw( bool "" 0+ ${} @{} %{} &{} *{} )
);

sub ref {
	CORE::ref($_[0]->$vivify_scalar());
}

sub AUTOLOAD {
	my ( $method ) = ( our $AUTOLOAD =~ /([^:]+)$/ );
	$_[0]->$vivify_scalar();
	unshift @_, $method;
	goto $Data::Thunk::Code::call_method;
}

sub DESTROY { }

1;

__END__
=pod

=encoding utf-8

=head1 NAME

Data::Thunk::ScalarValue

=head1 AUTHOR

Yuval Kogman

=head1 COPYRIGHT AND LICENSE

This software is Copyright (c) 2010 by Yuval Kogman.

This is free software, licensed under:

  The MIT (X11) License

=cut