Bivio::Type::TupleSlotType
# Copyright (c) 2008 bivio Software, Inc. All Rights Reserved. # $Id$ package Bivio::Type::TupleSlotType; use strict; use Bivio::Base 'Type.TupleSlot'; my($_IDI) = __PACKAGE__->instance_data_index; sub DEFAULT_CLASS { return 'String'; } sub as_string { my($self) = @_; return shift->SUPER::as_string(@_) unless ref($self); my($fields) = $self->[$_IDI]; my($s) = $fields->{choices}->to_literal($fields->{choices}); my($c) = $fields->{class}->simple_package_name; $c = $self->DEFAULT_CLASS if $c eq 'TupleSlot'; return $self->simple_package_name . '[' . $c . (length($s) ? ";$s" : '') . ']'; } sub get { return shift->[$_IDI]->{shift(@_)} || die; } sub from_literal { my($self) = shift; return $self->SUPER::from_literal(@_) unless ref($self); my($fields) = $self->[$_IDI]; my($v, $e) = $fields->{class}->from_literal(@_); return ($v, $e) unless defined($v); my($c) = $self->[$_IDI]->{choices}; return $v unless defined($c) && $c->is_specified; my($found); $c->do_iterate( sub {($found = $fields->{class}->is_equal(shift, $v)) ? 0 : 1}); return $found ? $v : (undef, Bivio::TypeError->NOT_FOUND); } sub new { my($self) = shift->SUPER::new; my($class, $choices) = @_; $self->[$_IDI] = { class => Bivio::Type->get_instance( $class eq $self->DEFAULT_CLASS ? 'TupleSlot' : $class), choices => $choices, }; return $self; } 1;