#  Copyright (c) 2007, Enthought, Inc.
#  License: BSD Style.

# delegate.py --- Example of trait delegation

#--[Imports]--------------------------------------------------------------------
from traits.api import DelegatesTo, HasTraits, Instance, Str, TraitError

#--[Code]-----------------------------------------------------------------------
class Parent(HasTraits):
    first_name = Str
    last_name  = Str

class Child(HasTraits):
    first_name = Str
    last_name  = DelegatesTo('father')
    father     = Instance(Parent)
    mother     = Instance(Parent)

#--[Example*]-------------------------------------------------------------------

tony  = Parent(first_name='Anthony', last_name='Jones')
alice = Parent(first_name='Alice', last_name='Smith')
sally = Child( first_name='Sally', father=tony, mother=alice)

# Child delegates its 'last_name' to its 'father' object's 'last_name'
print sally.last_name
# Output: Jones

# Assign an explicit value to the child's 'last_name'
sally.last_name = 'Cooper'
print tony.last_name
#Output: Cooper

# Validation is still controlled by the father's 'last_name' trait
print 'Attempting to assign a Parent object to a Str trait...\n'
try:
    sally.last_name = sally.mother # ERR: string expected
except TraitError, c:
    print 'TraitError: ', c

"""
The exception printed will look similar to the following:

Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "c:\src\trunk\enthought\traits\trait_handlers.py", line 163, in error
    raise TraitError, ( object, name, self.info(), value )
traits.trait_errors.TraitError: The 'last_name' trait of a Child
instance must be a value of type 'str', but a value of <__main__.Parent object
at 0x009DD6F0> was specified.
"""
