# Copyright 2013 Eygene A. Ryabinkin.
#
# Collection of classes that implement const-like behaviour
# for various objects.

import copy

class ConstProxy (object):
	"""
	Implements read-only access to a given object
	that can be attached to each instance only once.

	"""

	def __init__ (self):
		self.__dict__['__source'] = None


	def __getattr__ (self, name):
		src = self.__dict__['__source']
		if src == None:
			raise ValueError ("using non-initialized ConstProxy() object")
		return copy.deepcopy (getattr (src, name))


	def __setattr__ (self, name, value):
		raise AttributeError ("tried to set '%s' to '%s' for constant object" % \
		  (name, value))


	def __delattr__ (self, name):
		raise RuntimeError ("tried to delete field '%s' from constant object" % \
		  (name))


	def set_source (self, source):
		""" Sets source object for this instance. """
		if (self.__dict__['__source'] != None):
			raise ValueError ("source object is already set")
		self.__dict__['__source'] = source
