###########################################################################
# Copyright 2000, 2001, 2004 Toby Ovod-Everett.  All rights reserved.
#
# This file is distributed under the Artistic License. See
# http://www.ActiveState.com/corporate/artistic_license.htm or
# the license that comes with your perl distribution.
#
# For comments, questions, bugs or general interest, feel free to
# contact Toby Ovod-Everett at toby@ovod-everett.org
##########################################################################

package Win32::CtrlGUI::State::bookkeeper;

use strict;
use 5.006;

use Win32::CtrlGUI;
use Win32::CtrlGUI::State;

our $VERSION = '0.31'; # VERSION from OurPkgVersion

sub new {
	my $class = shift;
	my($state) = @_;

	my $self = {
		state => $state,
		status => 'pfs',
		executed => 0,
	};

	bless $self, $class;
	return $self;
}

sub bk_status {
	my $self = shift;

	return $self->{status};
}

sub bk_set_status {
	my $self = shift;
	my($status) = @_;

	$status =~ /^comp|active|pcs|pfs|never$/ or die "Win32::CtrlGUI::State::bookkeeper::bk_set_status error: attempt to set illegal status of $status.";
	$self->{status} = $status;
}

sub bk_status_given {
	my $self = shift;
	my($pstatus) = @_;

	$pstatus =~ /^active|pcs|pfs|never$/ or die "Win32::CtrlGUI::State::bookkeeper::bk_status_given error: illegal status passed: $pstatus.";

	($self->bk_status eq 'active' && $pstatus !~ /^active|pfs$/) and die "Win32::CtrlGUI::State::bookkeeper::bk_status_given error: A child state is not allowed to be active if the parent is not.";
	$self->bk_status eq 'active' and return 'active';
	foreach my $i (qw(never pfs pcs active)) {
		($self->bk_status eq $i || $pstatus eq $i) and return $i;
	}
	die "Win32::CtrlGUI::State::bookkeeper::bk_status_given error: Should never get here.";
}

sub is_recognized {
	my $self = shift;

	$self->bk_status =~ /^active|pcs$/ or die "Win32::CtrlGUI::State::bookkeeper::is_recognized error: Cannot call in state ".$self->bk_status.".";
	return $self->{state}->is_recognized;
}

sub wait_recognized {
	my $self = shift;

	$self->bk_status =~ /^active|pcs$/ or die "Win32::CtrlGUI::State::bookkeeper::wait_recognized error: Cannot call in state ".$self->bk_status.".";
	return $self->{state}->wait_recognized;
}

sub do_action_step {
	my $self = shift;

	$self->bk_status eq 'active' or die "Win32::CtrlGUI::State::bookkeeper::do_action_step error: Cannot call in state ".$self->bk_status.".";
	$self->{state}->do_action_step;
}

sub wait_action {
	my $self = shift;

	$self->bk_status eq 'active' or die "Win32::CtrlGUI::State::bookkeeper::wait_action error: Cannot call in state ".$self->bk_status.".";
	return $self->{state}->wait_action;
}

sub do_state {
	my $self = shift;

	$self->bk_status =~ /^active|pcs$/ or die "Win32::CtrlGUI::State::bookkeeper::do_state error: Cannot call in state ".$self->bk_status.".";
	return $self->{state}->do_state;
}

sub reset {
	my $self = shift;

	return $self->{state}->reset;
}

sub AUTOLOAD {
	(my $func = our $AUTOLOAD) =~ s/^.*:://;

	no strict;
	*{$func} = $method = sub {
		my $self = shift;
		return $self->{state}->$func(@_);
	};
	goto &$method;
}

1;

# No documentation:

=for Pod::Coverage
.+

=cut
