Index: lang/perl/PlPy/trunk/PlPy/t/vm_test.t
===================================================================
--- lang/perl/PlPy/trunk/PlPy/t/vm_test.t (revision 220)
+++ lang/perl/PlPy/trunk/PlPy/t/vm_test.t (revision 222)
@@ -47,4 +47,11 @@
 ['Boo', 'fy']
 
+=== String.__str__
+--- SKIP
+--- input
+print "FOO".__str__()
+--- expected
+FOO
+
 === add,mul
 --- input
@@ -78,9 +85,17 @@
 
 === tuple
+--- input
+print (1,2,3)
+--- expected
+(1, 2, 3)
+
+=== tuple2
 --- SKIP
 --- input
-print (1,2,3)
---- expected
-(1, 2, 3)
+x,y,z = (1,2,3)
+print y
+--- expected
+2
+
 
 === list
@@ -232,5 +247,4 @@
 
 === string modulo by tuple
---- SKIP
 --- input
 print "mixi: %s, %s" % ('Boofy', 'bonnu')
@@ -239,9 +253,14 @@
 
 === dict
---- SKIP
+--- input
+print {"h":3}
+--- expected
+{'h' : 3}
+
+=== dict(2)
 --- input
 print {"hoge": 3, 5: 'moke'}
 --- expected
-{5: 'moke', 'hoge': 3}
+{5 : 'moke', 'hoge' : 3}
 
 === FOR
@@ -391,5 +410,6 @@
 ok
 
-=== hash
+=== get hash item.
+--- SKIP
 --- input
 x = {'foo': 'bar', 'boo':'fy'}
Index: lang/perl/PlPy/trunk/PlPy/lib/PlPy.pm
===================================================================
--- lang/perl/PlPy/trunk/PlPy/lib/PlPy.pm (revision 219)
+++ lang/perl/PlPy/trunk/PlPy/lib/PlPy.pm (revision 222)
@@ -9,4 +9,12 @@
 use autobox;
 use autobox::Core;
+
+use PlPy::Builtins::object;
+use PlPy::Builtins::map;
+use PlPy::Builtins::str;
+use PlPy::Builtins::float;
+use PlPy::Builtins::list;
+use PlPy::Builtins::tuple;
+use PlPy::Builtins::int;
 
 use Inline Python => <<'...';
@@ -229,4 +237,6 @@
                 } elsif ($type eq "<type 'float'>") {
                     push @$stack, PlPy::Builtins::float->new($val);
+                } elsif ($type eq "<type 'tuple'>") {
+                    push @$stack, PlPy::Builtins::tuple->new($val);
                 } elsif ($type eq "<type 'dict'>") {
                     push @$stack, $val;
@@ -658,152 +668,8 @@
 
 1;
-package PlPy::Builtins::object;
-use strict;
-use warnings;
-# super base class.
-
-use overload q{""} => sub { shift->__str__ };
-
-sub ___stringify {
-    my ($self, $x) = @_;
-    ref $x && $x->isa('PlPy::Builtins::str') ? "'$x'" : $x;
-}
-
-1;
-package PlPy::Builtins::tuple;
-use strict;
-use warnings;
-use base qw/PlPy::Builtins::object/;
-
-use overload q{""} => sub {
-    my $self = shift;
-    return '(' . join(", ", @$self) . ')';
-};
-
-sub new {
-    my ($class, $array) = @_;
-    bless [@$array], $class;
-}
-
-1;
-package PlPy::Builtins::list;
-use strict;
-use warnings;
-use base qw/PlPy::Builtins::object/;
-
-sub new {
-    my ($class, $array) = @_;
-    bless [@$array], $class;
-}
-
-sub __str__ {
-    my $self = shift;
-    return '[' . join(", ", map { $self->___stringify($_) } @$self) . ']';
-}
-
-sub __len__ {
-    my $self = shift;
-    return scalar @$self;
-}
-
-1;
-
-package PlPy::Builtins::map;
-use strict;
-use warnings;
-use base qw/PlPy::Builtins::object/;
-
-sub new {
-    my ($class, ) = @_;
-    bless {}, $class;
-}
-
-sub __str__ {
-    my $self = shift;
-    return '{' . join(", ", map { $self->___stringify($_) => $self->___stringify($self->{$_}) } keys %$self) . '}';
-}
-
-1;
-
-package PlPy::Builtins::int;
-use strict;
-use warnings;
-use base qw/PlPy::Builtins::object/;
-
-sub new {
-    my ($class, $i) = @_;
-    bless \$i, $class;
-}
-
-# for internal use only.
-sub ___deref {
-    my $self = shift;
-    return ${$self};
-}
-
-# TODO: use tt.
-sub __str__    { my $self = shift; ${$self} }
-sub __add__    { my ($self, $other) = @_; PlPy::Builtins::int->new( ${$self} +   ${$other} ) }
-sub __mul__    { my ($self, $other) = @_; PlPy::Builtins::int->new( ${$self} *   ${$other} ) }
-sub __div__    { my ($self, $other) = @_; PlPy::Builtins::int->new( ${$self} /   ${$other} ) }
-sub __sub__    { my ($self, $other) = @_; PlPy::Builtins::int->new( ${$self} -   ${$other} ) }
-sub __pow__    { my ($self, $other) = @_; PlPy::Builtins::int->new( ${$self} **  ${$other} ) }
-sub __mod__    { my ($self, $other) = @_; PlPy::Builtins::int->new( ${$self} %   ${$other} ) }
-sub __lshift__ { my ($self, $other) = @_; PlPy::Builtins::int->new( ${$self} <<  ${$other} ) }
-sub __rshift__ { my ($self, $other) = @_; PlPy::Builtins::int->new( ${$self} >>  ${$other} ) }
-sub __and__    { my ($self, $other) = @_; PlPy::Builtins::int->new( int(${$self}) &   int(${$other}) ) }
-sub __or__     { my ($self, $other) = @_; PlPy::Builtins::int->new( int(${$self}) |   int(${$other}) ) }
-sub __xor__    { my ($self, $other) = @_; PlPy::Builtins::int->new( int(${$self}) ^   int(${$other}) ) }
-sub __cmp__    { my ($self, $other) = @_; ${$self} <=> ${$other} }
-
-1;
-
-package PlPy::Builtins::float;
-use strict;
-use warnings;
-use base qw/PlPy::Builtins::object/;
-use XXX;
-
-sub new {
-    my ($class, $i) = @_;
-    bless \$i, $class;
-}
-
-sub __str__ { my $self = shift; ${$self} }
-sub __add__ { my ($self, $other) = @_; PlPy::Builtins::float->new( ${$self} + ${$other} ) }
-sub __mul__ { my ($self, $other) = @_; PlPy::Builtins::float->new( ${$self} * ${$other} ) }
-
-1;
-
-
-package PlPy::Builtins::str;
-use strict;
-use warnings;
-use base qw/PlPy::Builtins::object/;
-use XXX;
-use Scalar::Util qw/reftype/;
-
-sub new {
-    my ($class, $s) = @_;
-    bless \$s, $class;
-}
-
-sub __str__ { my $self = shift; ${$self} }
-sub __add__ { my ($self, $other) = @_; ${$self} . ${$other} }
-sub __mod__ {
-    my ($self, $other) = @_;
-    if ( reftype $other eq 'SCALAR' ) {
-        return PlPy::Builtins::str->new( sprintf(${$self}, ${$other}) );
-    } else {
-        return PlPy::Builtins::str->new( sprintf(${$self}, @{$other}) );
-    }
-}
-
-1;
 
 package PlPy::Class;
 use strict;
 use warnings;
-use XXX;
 
 sub new {
Index: lang/perl/PlPy/trunk/PlPy/lib/PlPy/Builtins/float.pm
===================================================================
--- lang/perl/PlPy/trunk/PlPy/lib/PlPy/Builtins/float.pm (revision 222)
+++ lang/perl/PlPy/trunk/PlPy/lib/PlPy/Builtins/float.pm (revision 222)
@@ -0,0 +1,16 @@
+package PlPy::Builtins::float;
+use strict;
+use warnings;
+use base qw/PlPy::Builtins::object/;
+
+sub new {
+    my ($class, $i) = @_;
+    bless \$i, $class;
+}
+
+sub __str__ { my $self = shift; ${$self} }
+sub __add__ { my ($self, $other) = @_; PlPy::Builtins::float->new( ${$self} + ${$other} ) }
+sub __mul__ { my ($self, $other) = @_; PlPy::Builtins::float->new( ${$self} * ${$other} ) }
+
+1;
+
Index: lang/perl/PlPy/trunk/PlPy/lib/PlPy/Builtins/object.pm
===================================================================
--- lang/perl/PlPy/trunk/PlPy/lib/PlPy/Builtins/object.pm (revision 222)
+++ lang/perl/PlPy/trunk/PlPy/lib/PlPy/Builtins/object.pm (revision 222)
@@ -0,0 +1,13 @@
+package PlPy::Builtins::object;
+use strict;
+use warnings;
+# super base class.
+
+use overload q{""} => sub { shift->__str__ };
+
+sub ___stringify {
+    my ($self, $x) = @_;
+    (ref $x && $x->isa('PlPy::Builtins::str')) ? "'$x'" : $x;
+}
+
+1;
Index: lang/perl/PlPy/trunk/PlPy/lib/PlPy/Builtins/str.pm
===================================================================
--- lang/perl/PlPy/trunk/PlPy/lib/PlPy/Builtins/str.pm (revision 222)
+++ lang/perl/PlPy/trunk/PlPy/lib/PlPy/Builtins/str.pm (revision 222)
@@ -0,0 +1,24 @@
+package PlPy::Builtins::str;
+use strict;
+use warnings;
+use base qw/PlPy::Builtins::object/;
+use Scalar::Util qw/reftype/;
+
+sub new {
+    my ($class, $s) = @_;
+    bless \$s, $class;
+}
+
+sub __str__ { my $self = shift; ${$self} }
+sub __add__ { my ($self, $other) = @_; ${$self} . ${$other} }
+sub __mod__ {
+    my ($self, $other) = @_;
+    if ( reftype $other eq 'SCALAR' ) {
+        return PlPy::Builtins::str->new( sprintf(${$self}, ${$other}) );
+    } else {
+        return PlPy::Builtins::str->new( sprintf(${$self}, @{$other}) );
+    }
+}
+
+1;
+
Index: lang/perl/PlPy/trunk/PlPy/lib/PlPy/Builtins/tuple.pm
===================================================================
--- lang/perl/PlPy/trunk/PlPy/lib/PlPy/Builtins/tuple.pm (revision 222)
+++ lang/perl/PlPy/trunk/PlPy/lib/PlPy/Builtins/tuple.pm (revision 222)
@@ -0,0 +1,16 @@
+package PlPy::Builtins::tuple;
+use strict;
+use warnings;
+use base qw/PlPy::Builtins::object/;
+
+use overload q{""} => sub {
+    my $self = shift;
+    return '(' . join(", ", @$self) . ')';
+};
+
+sub new {
+    my ($class, $array) = @_;
+    bless [@$array], $class;
+}
+
+1;
Index: lang/perl/PlPy/trunk/PlPy/lib/PlPy/Builtins/int.pm
===================================================================
--- lang/perl/PlPy/trunk/PlPy/lib/PlPy/Builtins/int.pm (revision 222)
+++ lang/perl/PlPy/trunk/PlPy/lib/PlPy/Builtins/int.pm (revision 222)
@@ -0,0 +1,33 @@
+package PlPy::Builtins::int;
+use strict;
+use warnings;
+use base qw/PlPy::Builtins::object/;
+
+sub new {
+    my ($class, $i) = @_;
+    bless \$i, $class;
+}
+
+# for internal use only.
+sub ___deref {
+    my $self = shift;
+    return ${$self};
+}
+
+# TODO: use tt.
+sub __str__    { my $self = shift; ${$self} }
+sub __add__    { my ($self, $other) = @_; PlPy::Builtins::int->new( ${$self} +   ${$other} ) }
+sub __mul__    { my ($self, $other) = @_; PlPy::Builtins::int->new( ${$self} *   ${$other} ) }
+sub __div__    { my ($self, $other) = @_; PlPy::Builtins::int->new( ${$self} /   ${$other} ) }
+sub __sub__    { my ($self, $other) = @_; PlPy::Builtins::int->new( ${$self} -   ${$other} ) }
+sub __pow__    { my ($self, $other) = @_; PlPy::Builtins::int->new( ${$self} **  ${$other} ) }
+sub __mod__    { my ($self, $other) = @_; PlPy::Builtins::int->new( ${$self} %   ${$other} ) }
+sub __lshift__ { my ($self, $other) = @_; PlPy::Builtins::int->new( ${$self} <<  ${$other} ) }
+sub __rshift__ { my ($self, $other) = @_; PlPy::Builtins::int->new( ${$self} >>  ${$other} ) }
+sub __and__    { my ($self, $other) = @_; PlPy::Builtins::int->new( int(${$self}) &   int(${$other}) ) }
+sub __or__     { my ($self, $other) = @_; PlPy::Builtins::int->new( int(${$self}) |   int(${$other}) ) }
+sub __xor__    { my ($self, $other) = @_; PlPy::Builtins::int->new( int(${$self}) ^   int(${$other}) ) }
+sub __cmp__    { my ($self, $other) = @_; ${$self} <=> ${$other} }
+
+1;
+
Index: lang/perl/PlPy/trunk/PlPy/lib/PlPy/Builtins/list.pm
===================================================================
--- lang/perl/PlPy/trunk/PlPy/lib/PlPy/Builtins/list.pm (revision 222)
+++ lang/perl/PlPy/trunk/PlPy/lib/PlPy/Builtins/list.pm (revision 222)
@@ -0,0 +1,22 @@
+package PlPy::Builtins::list;
+use strict;
+use warnings;
+use base qw/PlPy::Builtins::object/;
+
+sub new {
+    my ($class, $array) = @_;
+    bless [@$array], $class;
+}
+
+sub __str__ {
+    my $self = shift;
+    return '[' . join(", ", map { $self->___stringify($_) } @$self) . ']';
+}
+
+sub __len__ {
+    my $self = shift;
+    return scalar @$self;
+}
+
+1;
+
Index: lang/perl/PlPy/trunk/PlPy/lib/PlPy/Builtins/map.pm
===================================================================
--- lang/perl/PlPy/trunk/PlPy/lib/PlPy/Builtins/map.pm (revision 222)
+++ lang/perl/PlPy/trunk/PlPy/lib/PlPy/Builtins/map.pm (revision 222)
@@ -0,0 +1,31 @@
+package PlPy::Builtins::map;
+use strict;
+use warnings;
+use base qw/PlPy::Builtins::object/;
+use Tie::RefHash;
+
+sub new {
+    my ($class, ) = @_;
+    my %x;
+    tie %x, 'Tie::RefHash';
+    bless \%x, $class;
+}
+
+sub __str__ {
+    my $self = shift;
+    return '{' . join(
+        ", ",
+        map {
+            $self->___stringify($_) . " : "
+              . $self->___stringify( $self->{$_} )
+          } keys %$self
+    ) . '}';
+}
+
+sub __setitem__ {
+    my ($self, $key, $val) = @_;
+    $self->{$key} = $val;
+}
+
+1;
+
