Bivio::Type::EnumDelegate
# Copyright (c) 2012 bivio Softare, Inc. All Rights Reserved.
# $Id$
package Bivio::Type::EnumDelegate;
use strict;
use Bivio::Base 'Bivio.Delegate';
our($AUTOLOAD);
our($_PREV_AUTOLOAD) = '';
my($_MAP) = {};
sub AUTOLOAD {
my($proto) = shift;
my($method) = $AUTOLOAD =~ /([^:]+)$/;
return
if $method eq 'DESTROY';
die($AUTOLOAD, ': infinite delegation loop')
if $AUTOLOAD eq $_PREV_AUTOLOAD;
local($_PREV_AUTOLOAD) = $AUTOLOAD;
my($delegator) = $proto->internal_delegator_package;
return $delegator->can($method)
? $delegator->$method(@_)
: b_die($method, ': method not found in ', $delegator, ' or ', $proto->package_name);
}
sub internal_delegator_package {
return $_MAP->{shift->package_name}
|| b_die('delegator_package not set');
}
sub internal_set_delegator_package {
my($proto, $delegator) = @_;
$delegator = $delegator->package_name;
$proto = $proto->package_name;
b_die($delegator, ': already set to other package: ', $_MAP->{$proto})
if $_MAP->{$proto} && $_MAP->{$proto} ne $delegator;
return $_MAP->{$proto} = $delegator;
}
1;